Manacher裸题。
#include <cstring> #include <stdio.h> #define MAXN 110500 #define min(a,b) (a)<(b)?(a):(b) using namespace std; int p[MAXN<<1],id,maxn; char s[MAXN<<1]; void Manacher(){ int len=strlen(s); for(int i=len;i>=0;i--){ s[i*2+2]=s[i]; s[i*2+1]='#'; } s[0]='*'; for(int i=2;i<2*len+1;i++){ if(p[id]+id>i)p[i]=min(p[2*id-i],p[id]+id-i); else p[i]=1; while(s[i-p[i]]==s[i+p[i]])p[i]++; if(p[id]+id<p[i]+i)id=i; if(p[i]>maxn)maxn=p[i]; } } int main(){ while(~scanf("%s",s)){ id=0;maxn=0; memset(p,0,sizeof p); Manacher(); printf("%d ",maxn-1); } }