BZOJ2342: [Shoi2011]双倍回文

对每个可能成为本质不同回文子串的串判一下就好了,复杂度$O(n)$。

#include<cstdio>
const int N=5e5+5;
int n,s,f[N];
char z[N];
int main(){
	scanf("%d ",&n);
	fread(z+1,1,n,stdin);
	z[0]='^';
	for(int i=1,j=0;i<=n;++i){
		int k=j+f[j];
		if(i<k&&f[j*2-i]<k-i)
			f[i]=f[j*2-i];
		else{
			f[j=i]=i<k?k-i:0;
			while(z[i-f[i]]==z[i+f[i]+1]){
				int l=++f[i]/2;
				if(l>s&&f[i-l]>=l)s=l;
			}
		}
	}
	printf("%d\n",s*4);
}
posted @ 2017-03-28 09:23  f321dd  阅读(257)  评论(0编辑  收藏  举报