字符串哈希.

简介:

有许多哈希函数,其中很普遍,好用的一个就是BKDR函数.

BKDR_hash:

将string串转化为一个x进制的数字储存.

例如:

string T={1,2,3};

x=6;

hash_code=1*6^{2}+2*6^{1}+3;

扩展为:

string T={T1,T2,T3};

hash_code=T1*X^{2}+T2*X^{1}+T3;

 

注意:

因为hash_code的值会很大会爆掉,所以我们去设一个数字M去取模.

我们都知道哈希函数其实是设一个映射关系,前者的集合里边的元素越多,那么映射后的集合里边的元素也就越多.

我们设的M可以理解为存放最后结果的容器的容量.

假设我们取模2,但是我们有三个不同的字符串等待哈希.那么取模后的结果无非就是0或1,只有两种可能,那必有两个不同的字符串的哈希值是相同的.

所以我们设的M要大于字符串的数量.

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int N=1000010;
const int X=13331;
char T[N];
char S[N];
ull h[N],x[N],hs[N];
vector<ull>v;
void BKDR_hash(char s[])
{
    h[0]=s[0];
    x[0]=1;
    int ln=strlen(s);
    for(int i=1;i<ln;i++)
    {
        h[i]=h[i-1]*X+s[i];
        x[i]=x[i-1]*X;
    }
}

ull get_hash(int left,int right)
{
    if(!left)
        return h[right];
    else
        return h[right]-h[left-1]*x[right-left+1];
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>T;
    BKDR_hash(T);
    cin>>S;
    ull hs2=0;
    for(int i=0;i<strlen(S);i++)
        hs2=hs2*X+S[i];
    for(int i=0;i<strlen(T);i++)
        cout<<get_hash(i,min(strlen(T)-1,i+strlen(S)-1))<<" ";
    cout<<endl;
    cout<<hs2<<endl;
    //检测S串是否是T串的子串    通过对比hash_code值
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷月半明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值