POJ3974
/* 最长回文子串算法 manacher算法 O(n)线性算法 当然也使用扩展的KMP算法 O(nlogn) */ #include <cstdio> #include <cstdlib> #include <iostream> #include <cmath> #include <algorithm> #include <cstring> using namespace std; #define MAXN 1000010 char in[MAXN],in2[MAXN*2]; int p[MAXN*2]; int n,m; void init() { in2[0] = '$'; m = 1; for(int i=0;in[i];i++) { in2[m++] = '#'; in2[m++] = in[i]; } in2[m] = '#'; in2[m+1] = '@'; } void solve(int &ans) { for(int i=1;i<=m;++i) p[i] = 0; p[1] = 1; int mx_right = 1; int mx_center = 1; ans = 1; for(int i=2;i<=m;++i) { if( mx_right>i ) { p[i] = min( mx_right-i+1,p[2*mx_center-i] ); } else { p[i] = 1; } while(in2[i-p[i]]==in2[i+p[i]]) p[i]++; if( i+p[i]-1>mx_right ) { mx_right = i+p[i]-1; mx_center = i; } if( p[i]>ans ) ans=p[i]; } } int main() { int cas = 1,ans; while(1) { scanf("%s",in); if(in[0]=='E') break; init(); ans = 0; solve(ans); printf("Case %d: %d\n",cas++,ans-1); } return 0; }