参考http://blog.csdn.net/xingyeyongheng/article/details/9310555
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
using namespace std;
const int MAX=1000010;
int p[MAX*2] = {0};
char s[MAX * 2];
int main(){
int n;
cin >> n;
for (int j = 0; j < n;j++)
{
string word;
cin >> word;
int len = word.length(), id = 0, maxlen = 0;
for (int i = len; i >= 0; --i)
{
s[i + i + 2] = word[i];
s[i + i + 1] = '#';
}
s[0] = '*';
for (int i = 2; i<2 * len + 1; ++i){
if (p[id] + id>i)p[i] = min(p[2 * id - i], p[id] + id - i);
else p[i] = 1;
while (s[i - p[i]] == s[i + p[i]])++p[i];
if (id + p[id] < i + p[i])id = i;
if (maxlen < p[i])maxlen = p[i];
}
cout << maxlen - 1 << endl;
}
return 0;
}