Hdu 3068 最长回文(Manacher模版题)
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int N=220010; using namespace std; char str[N]; char tmp[N]; int len[N]; int init(){ tmp[0]='$'; int i=0,nlen=1; while(str[i]!='\0'){ tmp[nlen++]='#'; tmp[nlen++]=str[i]; i++; } tmp[nlen++]='#';
tmp[nlen]=0; return nlen; } int Manacher(int x){ int mx=0,ans=1,pos=0; for(int i=0;i<x;i++){ len[i]=mx>i?min(mx-i,len[2*pos-i]):1; while(tmp[i-len[i]]==tmp[i+len[i]])len[i]++; if(len[i]+i>mx){ mx=len[i]+i; pos=i; } ans=max(ans,len[i]); } return ans-1; } int main(){ while(~scanf("%s",str)){ memset(len,0,sizeof(len)); int x=init(); printf("%d\n",Manacher(x)); } return 0; }