#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Mod1=998244353,Mod2=1e9+7;
int n,ans,pow1[11000005],pow2[11000005],h1[11000005],h3[11000005];
char s[11000005];
bool check(int mid)
{
if(mid>n)
return false;
for(int i=1;i<=n-mid+1;i++)
{
int tmp1=(h1[i+mid-1]-h1[i-1]*pow1[mid]%Mod1+Mod1)%Mod1;
// int tmp2=(h2[i+mid-1]-h2[i-1]*pow2[mid]%Mod2+Mod2)%Mod2;
int tmp3=(h3[i]-h3[i+mid]*pow1[mid]%Mod1+Mod1)%Mod1;
// int tmp4=(h4[i]-h4[i+mid]*pow2[mid]%Mod2+Mod2)%Mod2;
if(tmp1==tmp3)
return true;
}
return false;
}
signed main()
{
scanf("%s",s+1);
n=strlen(s+1);
pow1[0]=pow2[0]=1;
for(int i=1;i<=n;i++)
{
pow1[i]=pow1[i-1]*131%Mod1;
pow2[i]=pow2[i-1]*131%Mod2;
h1[i]=(h1[i-1]*131+s[i]-'a'+1)%Mod1;
// h2[i]=(h2[i-1]*131+s[i]-'a'+1)%Mod2;
}
for(int i=n;i>=1;i--)
{
h3[i]=(h3[i+1]*131+s[i]-'a'+1)%Mod1;
// h4[i]=(h4[i+1]*131+s[i]-'a'+1)%Mod2;
}
int l=1,r=n>>1;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid<<1))
{
l=mid+1;
ans=mid<<1;
}
else
r=mid-1;
}
l=1,r=n>>1;
while(l<=r)
{
int mid=(l+r)>>1;
if(check((mid<<1)+1))
{
l=mid+1;
ans=max(ans,(mid<<1)+1);
}
else
r=mid-1;
}
cout<<ans;
}
二分+hashTLE了,有什么优化建议吗?