0801
已结束
IOI
开始于: 2026-8-1 13:30
9
小时
主持人:
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;
}
- 状态
- 已结束
- 规则
- IOI
- 题目
- 6
- 开始于
- 2026-8-1 13:30
- 结束于
- 2026-8-1 22:30
- 持续时间
- 9 小时
- 主持人
- 参赛人数
- 4