模板:(多重)哈希

前言

还在为不想写双哈希又怕哈希冲突挂掉发愁吗?
来这里,满足你的一切梦想!

哈希还有模板?
其实就是把相关的函数和数组打包到一个结构体里
但是针心方便啊!!!
如果想双哈希的话,定义一个h2就好啦
极其方便,避免各种数组冲突、复制数组没改干净等烦恼
甚至还可以有这样的惊天n重哈希
这能卡掉我给您跪下
(复制的话点个赞呗亲awa)

11哈希

int key[12]={0,131,133,107,173,1091,31,131,1331,11,257,277};
int mod[12]={0,1000000021,1000000033,1000000087,100000081,1000000123,1000000447,1000000349,1000000513,100000471,1000000607,10000723};
int p[N],ans;
int jd[N];
int main(){
//	printf("%d\n",sizeof(h1)/1024/1024);
	for(int i=1;i+m-1<=n;i++) jd[i]=1;
	for(int o=1;o<=11;o++){
		h1.init(key[o],mod[o]);
		h1.gethash();
		for(int st=1;st+m-1<=n;st++){
			if((st-1)%(5*m)==0) h1.getfresh(st,st+10*m-1);
			jd[st]&=h1.calc(st);
			//calc这样的函数按题目需要加到结构体里就行拉
		}
	}
	for(int i=1;i+m-1<=n;i++){
		if(jd[i]) p[++ans]=i;
	}
	printf("%d\n",ans);
	for(int i=1;i<=ans;i++) printf("%d ",p[i]);
	return 0;
}

完整代码

struct Hash{
	int key;
	ull mod;
	ull h1[N][26],h2[N][26],mi[N];
	node q1[105],q2[105];
	int jd[27],to[27];
	void init(int x,ull y){
		memset(jd,0,sizeof(jd));
		memset(to,0,sizeof(to));
		key=x;mod=y;
		mi[0]=1;
		for(int i=1;i<=max(n,m);i++) mi[i]=mi[i-1]*key%mod;
	}
	void gethash(){
		for(int i=1;i<=n;i++){
			for(int j=0;j<=25;j++){
				h1[i][j]=(h1[i-1][j]*key+(s[i]=='a'+j))%mod;
			}
		}
		for(int i=1;i<=m;i++){
			for(int j=0;j<=25;j++){
				h2[i][j]=(h2[i-1][j]*key+(t[i]=='a'+j))%mod;
			}
		}
	}
	ull Hash1(int l,int r,int k){
		//if(k<=4) printf("l=%d r=%d k=%d ans=%llu\n",l,r,k,h1[r][k]-h1[l-1][k]*mi[r-l+1]);
		return (h1[r][k]-h1[l-1][k]*mi[r-l+1]%mod+mod)%mod;
	}
	ull Hash2(int l,int r,int k){
		return (h2[r][k]-h2[l-1][k]*mi[r-l+1]%mod+mod)%mod;
	}
}h1;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值