哈希冲突hash

本文介绍了如何使用双哈希模板(stuHASH结构)对输入字符串进行哈希处理,计算给定长度范围内独特子串的数量。程序首先初始化两个哈希函数,然后对字符串进行哈希并存储结果,最后统计不重复子串的个数。
摘要由CSDN通过智能技术生成

Hash Killer II
#include<bits/stdc++.h>
using namespace std;
int n=100000,l;
long long a[100005];
string s; 
int main(){
    srand(time(0));
    for(int i=1;i<=n;i++){
        char c=rand()%26+97;
        s+=c;
    }
    l=20;
    cout<<n<<" "<<l<<"\n";
    cout<<s;
    return 0;
}
双哈希模板
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
struct stu HASH{
    long long sed,mod,h[N],pw[N];
    void init(long long sed_in,long long mod_in){
        sed=sed_in,mod=mod_in;
        pw[0]=1;
        for(int i=1;i<N;i++){
            pw[i]=pw[i-1]*sed%mod;
        }
    }
    void make(string s){
        h[1]=s[1]%mod;
        for(int i=2;i<=s.size();i++){
            h[i]=(h[i-1]*sed%mod+s[i])%mod;
        } 
    }
    long long get(int l,int r){
        return (h[r]-h[l-1]*pw[r-l+1]%mod+mod)%mod;
    }
};
int main(){
    
    return 0;
}
不同字串
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
int n,l,cnt;
string s;
struct stu HASH{
    long long sed,mod,h[N],pw[N];
    void init(long long sed_in,long long mod_in){
        sed=sed_in,mod=mod_in;
        pw[0]=1;
        for(int i=1;i<N;i++){
            pw[i]=pw[i-1]*sed%mod;
        }
    }
    void make(string s){
        h[1]=s[1]%mod;
        for(int i=2;i<=s.size();i++){
            h[i]=(h[i-1]*sed%mod+s[i])%mod;
        } 
    }
    long long get(int l,int r){
        return (h[r]-h[l-1]*pw[r-l+1]%mod+mod)%mod;
    }
}t1,t2;
int main(){
    cin>>n>>l;
    cin>>s;
    t1.init(131,1e9+7);
    t2.init(128,998244353);
    s=" "+s;
    t1.make(s);
    t2.make(s);
    for(int i=1;i<=n-l+1;i++){
        cnt++;
        p[cnt].first=t1.get(i,i+l-1);
        p[cnt].second=t2.get(i,i+l-1); 
    }
    sort(p+1,p+1+n-l+1);
    int ans=1;
    for(int i=2;i<=n-l+1;i++){
        if(p[i]!=p[i-1]){
            ans++;
        }
    }
    cout<<ans;
    return 0;

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值