题解:用manacher算法可以O(N)求出。想看具体题解可以去看神犇的解释QAQ。
for(i=2;i<len+len+1;i++){ if(p[ids]+ids>i){ p[i]=min(p[2*ids-i],p[ids]+ids-i); } else p[i]=1; while(s[i-p[i]]==s[i+p[i]])++p[i]; if(ids+p[ids]<i+p[i])ids=i; if(p[ids]>maxlen)maxlen=p[i]; }
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char s[111111*2]; int p[111111*2]; int main(){ while(scanf("%s",s)!=EOF){ int ids=0,maxlen=0,i,len=strlen(s); for(i=len;i>=0;i--){ s[i+i+2]=s[i]; s[i+i+1]='#'; } s[0]='*'; for(i=2;i<len+len+1;i++){ if(p[ids]+ids>i){ p[i]=min(p[2*ids-i],p[ids]+ids-i); } else p[i]=1; while(s[i-p[i]]==s[i+p[i]])++p[i]; if(ids+p[ids]<i+p[i])ids=i; if(p[ids]>maxlen)maxlen=p[i]; } printf("%d\n",maxlen-1); } return 0; }