- 最长回文
- HDU - 3068
- 以每个点 为中心的最长回文长度为 半径 -1
-
#include<bits/stdc++.h> using namespace std; #define maxn 123465 char str[maxn],cp[maxn*2]; int p[maxn*2],len,ans; void manacher() { int mx=0,id=0; for(int i=1; i<len; i++) { p[i]=(mx>i?min(p[2*id-i],mx-i):1); while(cp[i-p[i]]==cp[i+p[i]])p[i]++; if(i+p[i]>mx)id=i,mx=i+p[i]; } } int main() { while(scanf("%s",str)!=EOF) { ans=1; len=strlen(str); cp[0]='(',cp[1]='#'; for(int i=0,j=2; i<len; i++,j+=2) { cp[j]=str[i]; cp[j+1]='#'; } len=len*2+3; cp[len-1]=')'; manacher(); for(int i=1; i<len; i++) ans=max(p[i]-1,ans); printf("%d\n",ans); } return 0; }
09-18
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交