字符串哈希.
简介:
有许多哈希函数,其中很普遍,好用的一个就是BKDR函数.
BKDR_hash:
将string串转化为一个x进制的数字储存.
例如:
string T={1,2,3};
x=6;
hash_code=1*+2*
+3;
扩展为:
string T={T1,T2,T3};
hash_code=T1*+T2*
+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值
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)