[POJ 3974]Palindrome
转载请注明出处:http://danihao123.is-programmer.com/
Manacher……妙,妙啊……
这个题就要是给一个字符串,输出最大回文字串长度。Manacher即可。
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=1000005; char buf[maxn],s[maxn<<1]; int p[maxn<<1]; inline void FactStr(){ register int i,j=0,n=strlen(buf); s[j++]='$'; s[j++]='#'; for(i=0;i<n;i++){ s[j++]=buf[i]; s[j++]='#'; } s[j]='\0'; } inline int Manachar(){ register int i,n=strlen(s); register int mx=0,id; register int ans=-1; for(i=1;i<n;i++){ if(i<mx) p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(s[i-p[i]]==s[i+p[i]]) p[i]++; if((p[i]+i)>mx){ id=i; mx=p[i]+i; } ans=max(ans,p[i]-1); } return ans; } int main(){ register int Case=0; while(scanf("%s",buf)==1){ if(buf[0]=='E') break; Case++; FactStr(); printf("Case %d: %d\n",Case,Manachar()); } return 0; }