题目链接:http://poj.org/problem?id=3974

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int N = 2e6+7; int p[N]; char s[N]; int Manacher(char s[], int n) { int Id=0, mx = 0, ans = 0; for(int i=2; i<n; i++) { if(mx > i) p[i] = min(p[Id*2-i], mx-i); else p[i] = 1; while(s[i+p[i]] == s[i-p[i]]) p[i]++; if(mx < p[i]+i) { mx = p[i]+i; Id = i; } ans = max(ans, p[i]); } return ans - 1; } int main() { int t=1; while(scanf("%s", s),strcmp(s, "END")) { int len = strlen(s); for(int i=len; i>=0; i--) { s[i+i+2] = s[i]; s[i+i+1] = '#'; } s[0] = '$'; int ans = Manacher(s, 2*len+2); printf("Case %d: %d ", t++, ans); } return 0; }