双哈希模板(求所给字符串不一样的有多少个)

本文探讨了如何使用双哈希算法来计算给定字符串集合中不同字符串的数量。通过这种方法,可以高效地处理大量数据并找出唯一的字符串,适用于数据处理和算法优化的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N =1e5; 
const int mod[]={19260817,19660813};
const int base[]={233,2333};
int  Hash[2][N],f[2][N];
int idx;
int n;
struct dina{
	int x, y ; 
}node[2*N]; 
void initHash(string s){
    int n=s.size();
    Hash[0][0]=Hash[1][0]=0;
    for(int j=0;j<2;j++){
        for(int i=1;i<=n;i++) {
            Hash[j][i]=(Hash[j][i-1]*base[j]+(s[i-1]-'a'+1))%mod[j];
        }
    }node[idx].x=Hash[0][n];
    node[idx].y=Hash[1][n];
    idx++; 
}
bool cmp(const dina &t,const dina &q) 
{
	return t.x<q.x; 
}
pair<int,int>getHash(int l,int r){
    return make_pair((Hash[0][r]-(Hash[0][l-1]*f[0][r-l+1])%mod[0]+mod[0])%mod[0],
        (Hash[1][r]-(Hash[1][l-1]*f[1][r-l+1])%mod[1]+mod[1])%mod[1]);
}
void init() {
    f[0][0]=f[1][0]=1;
    for(int j=0;j<2;j++) {
        for(int i=1;i<N;i++) {
            f[j][i]=f[j][i-1]*base[j]%mod[j];
        }
    }
}
signed main()
{    init(); 
//	 int t ;
	 cin>>n ; 
	 int t =n ; 
	 int  ans= 1; 
	 while(t--)
	{
		string s; 
		cin>>s;  
		initHash(s); 
	}sort(node,node+n,cmp); 
	 for (int i=2;i<=n;i++)
        if (node[i].x!=node[i-1].x || node[i-1].y!=node[i].y)
		   { 
			 ans++;
		   }
    	printf("%lld\n",ans);
		return  0 ; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值