#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int length = 110000 + 10; char s[length * 2]; int p[length * 2]; int main(void) { freopen("1.txt", "r", stdin); while(scanf("%s", s) != EOF) { int len = strlen(s), id = 0, mx = 0; for(int i = len; i >= 0; --i) { s[2 * i + 2] = s[i]; s[2 * i + 1] = '#'; } s[0] = '*'; for(int i = 2; i < 2 * len + 1; ++i) { if(id + p[id] > i) p[i] = min(p[2 * id - i], id + p[id] - i); else p[i] = 1; while(s[i + p[i]] == s[i - p[i]]) ++p[i]; if(i + p[i] > id + p[id]) id = i; if(mx < p[i]) mx = p[i]; } cout << mx - 1 << endl; } return 0; }
两个例子用于理解