直接看代码:
=====================================================================================================
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MAXN = 1e6+7; const int oo = 1e9+37; char s[MAXN]; int p[MAXN]; int Manacher(int N) { int id=0, Max=0; for(int i=2; i<N; i++) { p[i] = 1; if(p[id]+id > i) p[i] = min(p[id*2-i], p[id]+id-i); while( s[ i+p[i] ] == s[ i-p[i] ] ) p[i]++; if(p[id]+id < p[i]+i) id = i; Max = max(Max, p[i]-1); } return Max; } int main() { while(scanf("%s", s) != EOF) { int N = strlen(s); for(int i=N; i>=0; i--) { s[i+i+2] = s[i]; s[i+i+1] = '#'; } s[0] = '$'; printf("%d ", Manacher(N+N+1)); } return 0; }