#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1000001
int next[N];
char a[N];
void getnext(int m){
int i=0,j=-1;
next[0]=-1;
while(i<=m){
if(j==-1||a[i]==a[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
bool kmp(int st,int l){
int j=0;
int i=st+1;
int ed=l-st-1;
while(i<ed)
{
if(j==-1||a[i]==a[j]){
i++;
j++;
if(j==st+1) return true;
}
else j=next[j];
}
return false;
}
bool judge(int ans,int l){
for(int i=0;i<=ans;i++)
{
if(a[i]!=a[l-ans+i-1]) return false;
}
return true;
}
int getsolve(){
int l=strlen(a);
int ans=0;
getnext(int(l/3)-1);
if(l<3) return 0;
for(int i=l/3-1;i>=0;i--){
if(judge(i,l)){
if(kmp(i,l))
{
ans=i+1;
break;
}
}
}
return ans;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",a);
printf("%d\n",getsolve());
}
return 0;
}
这题一方面是要从最大长度开始判断,这样只要符合就直接输出了。
另一方面中间查找时要用kmp,不用应该会超时吧,比赛时很多超时的。