简单哈希WA ON #13求助
查看原帖
简单哈希WA ON #13求助
378706
MoyunAllgorithm楼主2023/8/7 22:25
#include <bits/stdc++.h>
#define LL long long
#define PLL pair<long long,long long>
#define FI first
#define SE second;
using namespace std;
const int MAXN=1e6+5;
const int BASE1=29,BASE2=33,MOD1=1e9+7,MOD2=1e9+9;
int h1[MAXN],h2[MAXN],po1[MAXN],po2[MAXN];
char s[MAXN],t[MAXN];
int cnt0,cnt1,S,T;
LL ans=0;
int Hash1(int l,int r) 
{
//	printf("%d\n",(0+MOD1)%MOD1);
	return ((1ll*h1[r]-1ll*h1[l-1]*po1[r-l+1])%MOD1+MOD1)%MOD1;
}
int Hash2(int l,int r) 
{
	return ((1ll*h2[r]-1ll*h2[l-1]*po2[r-l+1])%MOD2+MOD2)%MOD2;
}
int main()
{
	scanf("%s",s+1);
	S=strlen(s+1);
	scanf("%s",t+1);
	T=strlen(t+1);
	for(int i=1;i<=S;i++) 
	{
		if(s[i]=='0') cnt0++;
		else cnt1++;
	}
	po1[0]=po2[0]=1;
	for(int i=1;i<=T;i++)
	{
		h1[i]=(1ll*h1[i-1]*BASE1+(t[i]-'a'+1))%MOD1;
		h2[i]=(1ll*h2[i-1]*BASE2+(t[i]-'a'+1))%MOD2;
		po1[i]=po1[i-1]*BASE1%MOD1;
		po2[i]=po2[i-1]*BASE2%MOD2;
	//	printf("HASH%d %d\n",h1[i],h2[i]);
	}
	for(int i=1;i<=T;i++)
	{
		int ra1=Hash1(1,i),ra2=Hash2(1,i);
		int rb1=-1,rb2=-1;
		int len=(1ll*T-1ll*i*cnt0)/cnt1;
		if(1ll*len*cnt1+1ll*i*cnt0!=T||len<1) continue;
		int l=1;
		bool flag=1;
	//	printf("--%d %d %d %d %d %d--\n",i,cnt0,cnt1,len,ra1,ra2);
		for(int j=1;j<=S;j++)
		{
		//	printf("L%d ",l);
			if(l>T) break;
			if(s[j]=='0')
			{
				int r=l+i-1;
				if(Hash1(l,r)!=ra1||Hash2(l,r)!=ra2)
				{
					flag=0;
					break;
				} 
			//	printf("CHANGE!%d\n",r+1);
				l=r+1;
			}
			else if(s[j]=='1')
			{
		//		puts("!!!");
				int r=l+len-1;
				int has1=Hash1(l,r),has2=Hash2(l,r);
				if(rb1==-1) 
				{
					rb1=has1,rb2=has2;
					l=r+1;
					continue;
				}
				if(has1!=rb1||has2!=rb2)
				{
					flag=0;
					break;
				}
				l=r+1;
			}
		}
	//	printf("%d %d %d %d %d\n",flag,ra1,rb1,ra2,rb2);
		if(flag&&!(ra1==rb1&&ra2==rb2)) ans++;
	}
	printf("%d\n",ans);
	return 0;
}
2023/8/7 22:25
加载中...