TLE求调
查看原帖
TLE求调
737079
Zhulien30楼主2025/1/1 16:40
#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了,有什么优化建议吗?

2025/1/1 16:40
加载中...