用“马拉车”算法,规范代码,若原字符串为‘asdfasdfasdf’标记第一个字符为‘$’,最后一个字符为‘?’,然后中间再加工成'#a#s#d#f#a#s#d#f#a#s#d#f#',最后整一串为:'$#a#s#d#f#a#s#d#f#a#s#d#f#?'
处理完后跑一遍马拉车
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <math.h>
#include <cstdlib>
#include <queue>
using namespace std;
typedef long long LL;
const int MAXN = 2000505;
char s[MAXN];
char ch[MAXN*2];
int rad[MAXN*2];
int main()
{
int T;
char a;
///freopen("in.txt","r",stdin);
scanf("%d",&T);
a = getchar();
while(T--){
scanf("%s",s);
int len = strlen(s);
for(int i = 0;i<len*2+3;i++)rad[i] = 1;
for(int i = 0;i<len;i++){
ch[(i<<1)+1] = '#';
ch[(i<<1)+2] = s[i];
}
ch[0] = '$',ch[len*2+1] = '#',ch[len*2+2] = '?';
ch[len*2+3] = '\0';
//cout << ch << endl;
for(int i = 1,j = 0,k;i<len*2+3;){
while(ch[i-j-1] == ch[i+1+j])j++;
rad[i] += j;
for(k = 1;k<=j&&rad[i]-k!=rad[i-k];k++)rad[i+k] = min(rad[i]-k,rad[i-k]);
i+=k;
j = max(j-k,0);
}
int num = 0,maxs = 0,pos = 0;
for(int i = 0;i<2*len+3;i++){
if(rad[i]>maxs){
maxs = rad[i];pos = i;
}
}
printf("%d\n",maxs-1);
}
return 0;
}