0801
Done
IOI
Start at: 2026-8-1 13:30
9
hour(s)
Host:
4
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const ll N = 2e6+5;
const ull Mod = 23333333;
ll n,len[N],ans;
string s[N];
ull p[N];
vector<ull>pre[N],suf[N];
unordered_map<ull,ll>mp;
ull Get(int l,int r,int x,int op){
if(op==1) return pre[x][r]-pre[x][l-1]*p[r-l+1];
return suf[x][l]-suf[x][r+1]*p[r-l+1];
}
int main(){
cin>>n;
p[0] = 1;
for(int i = 1; i<=2000000; i++) p[i] = p[i-1]*Mod;
for(int i = 1; i<=n; i++){
cin>>len[i]>>s[i];
s[i] = " "+s[i];
pre[i].resize(len[i]+2);
suf[i].resize(len[i]+2);
for(int j = 1; j<=len[i]; j++){
pre[i][j] = pre[i][j-1]*Mod+s[i][j];
}
for(int j = len[i]; j>=1; j--){
suf[i][j] = suf[i][j+1]*Mod+s[i][j];
}
mp[pre[i][len[i]]]++;
}
for(int i = 1; i<=n; i++){
for(int j = 1; j<=len[i]; j++){
int l = j+1, r = len[i];
int mid = l+r>>1;
if((r-l+1)&1){
if(Get(l,mid-1,i,1)==Get(mid+1,r,i,0)) ans += mp[Get(1,j,i,1)];
} else{
if(Get(l,mid,i,1)==Get(mid+1,r,i,0)) ans += mp[Get(1,j,i,1)];
}
}
}
cout<<ans*2-n<<endl;
return 0;
}
- Status
- Done
- Rule
- IOI
- Problem
- 6
- Start at
- 2026-8-1 13:30
- End at
- 2026-8-1 22:30
- Duration
- 9 hour(s)
- Host
- Partic.
- 4