模板题。
关键:记一个最远延伸的起点id。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+4;
char s[N];
int p[N<<1];
inline int manacher(char *s) {
char t[N<<1];
t[0]='$';
int len=strlen(s);
for (int i=0;i<len;++i)
t[i<<1|1]='#',t[(i<<1)+2]=s[i];
t[len=len<<1|1]='#';
int id=0,ret=0;
for (register int i=1;i<=len;++i) {
p[i]=id+p[id]>i?min(p[(id<<1)-i],id+p[id]-i):1;
while (t[i+p[i]]==t[i-p[i]]) ++p[i];
if (i+p[i]>id+p[id]) id=i;
ret=max(ret,p[i]-1);
}
return ret;
}
int main() {
int kase;
scanf("%d",&kase);
while (kase--) {
scanf("%s",s);
printf("%d\n",manacher(s));
}
return 0;
}