输入
1
abrahellehhelleh
这份代码在本地运行会RE,打开注释后本地就能正常输出了,交洛谷上可以正常运行,有强神解释下吗,本地用的是Windows。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void rd(int &p){
int f=1;p=0;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
p*=f;
}
void rdl(ll &p){
ll f=1;p=0;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
p*=f;
}
const int N=1e6+50;
namespace A{
int n,f[N],s[N],ans(0);char a[N],c[N];
void solve(){
scanf("%s",a+1);n=strlen(a+1);
c[0]='#';ans=0;
for(int i(1);i<=n;++i){
c[i*2-1]='&';c[i*2]=a[i];
}n=n*2+1;c[n]='&';c[n+1]='?';
for(int i(1);i<=n;++i)s[i]=0,f[i]=0;
// for(int i(1);i<=n;++i)cout<<f[i]<<' ';cout<<endl;
// for(int i(1);i<=n;++i)cout<<s[i]<<' ';cout<<endl;
for(int i(1),r,mid;i<=n;++i){
if(r>=i)f[i]=min(r-i,f[2*mid-i]);
while(c[i+f[i]+1]==c[i-f[i]-1])++f[i];
if(i+f[i]>r)r=i+f[i],mid=i;s[i+f[i]]=max(s[i+f[i]],f[i]);
}
for(int i(n-1);i;--i)s[i]=max(s[i],s[i+1]-1);
for(int i(1);i<=n;++i){
if(c[i-s[i]]=='&'&&c[i]=='&'){
if(c[i+i-s[i]>>1]=='&'&&f[i+i-s[i]>>1]+(i+i-s[i]>>1)>=i)ans=max(ans,s[i]);
}
}
printf("%d\n",ans);
}
}
int main(){
int t;rd(t);
while(t--)A::solve();
return 0;
}