#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;
}
两个例子用于理解