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