最长回文 HDU - 3068 (Mannacher模板题)
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=110010; char t[maxn],s[maxn*3]; int p[maxn*3],lens; void init() { memset(s,'\0',sizeof(s)); int len=strlen(t); lens=0; s[lens++]='+'; for(int i=0;i<len;i++) s[lens++]='#',s[lens++]=t[i]; s[lens]='#'; } int Manacher() { int Maxlen=1,id=0,mx=0; memset(p,0,sizeof(p)); for ( int i=1; i<lens; i++ ){ p[i]= mx>i ? min( p[2*id-i],mx-i) : 1; while( s[i-p[i]] == s[i+p[i]] ) p[i]++; if( mx < i+p[i] ) mx=i+p[i], id=i; Maxlen=max( Maxlen,p[i]-1); } return Maxlen; } int main() { while(~scanf("%s",t)){ init(); printf("%d\n",Manacher()); } return 0; }