求教hash卡模数/自然溢出的方法
  • 板块学术版
  • 楼主YWHHDJSer
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/7/20 09:07
  • 上次更新2024/7/23 21:45:49
查看原帖
求教hash卡模数/自然溢出的方法
1163238
YWHHDJSer楼主2024/7/20 09:07

RT。 下面这个是代码,浅显易懂,1插入2查询。

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ri register int
const int mod=1145147777,base=197;
int in,cnt,num;
long long hs[10000001],bs[10000001];
string str,now;
il string chin()
{
	string rn="";
	char ch=getchar();
	ch=getchar();
	while(ch!='\n')
	{
		rn+=ch;
		ch=getchar();
	}
	return rn;
}
il long long _hash(string x)
{
	int y=x.size(),rn=0;
	for(ri i=0;i<y;i++)
	{
		rn*=base;
		rn+=x[i];
		rn%=mod;
	}
	return rn;
}
int main()
{
//	freopen("G_13.in","r",stdin);
//	freopen("G_13.out","w",stdout);
//	freopen("in.txt","r",stdin);
	bs[0]=1;
	while(scanf("%d",&in)!=EOF)
	{
		now=chin();
		if(in==1)
		{
			str+=now;
			for(ri i=cnt;i<str.size();i++)
			{
				hs[i+1]=hs[i]*base+now[i-cnt];
				hs[i+1]%=mod;
			}
			cnt=str.size();
		}
		else
		{
			long long fd=_hash(now),ans=0;
			while(num<now.size())
			{
				num++;
				bs[num]=bs[num-1]*base%mod;
			}
			for(ri i=now.size();i<=cnt;i++)
			{
				long long ah=((hs[i]-(hs[i-now.size()]*bs[now.size()])%mod)+mod)%mod;
				if(ah==fd)
				{
					ans++;
					i+=now.size();
				}
			}
			printf("%lld\n",ans);
		}
	}
	cout<<str;
	return 0;
}
2024/7/20 09:07
加载中...