字符串hash
1、基本概念
BKDRHash的基本思想就是把一个字符串当作一个k进制数来处理。
2、代码:
#define int unsigned long long //这种情况是使用自然溢出
const int mod = 1e9 + 7;
int prime = 19;//取一个素数
int BKDRHash(char *str){
int ans = 0;
for(int i = 0; str[i]; i ++){
ans = (1LL * ans * k + str[i]) % mod;
}
return ans;
}
//求字符串的hash值,假设字符串s的下标从1开始,长度为n。
hash[0] = 0;
for(int i = 1; i <= n; i++){
hash[i] = (hash[i - 1] * k + str[i]) % mod;
}
hash[i]就是s[1,,,i]的BKDRHash
求字符串某个区间[l,r]的BKDRHash值:
ll gethash(int l, int r){
if(l > r) return 0;
return (hash[r] - (hash[l - 1] * num1[r - l + 1]) % mod + mod)%mod;
}
3、例题
例题:已知X[1..4]是[-T,T]中的整数,求出满足方程AX[1]+BX[2]+CX[3]+DX[4] = P的解有多少组。
|P|<=1e9, |A|, |B|, |C|, |D| <= 1e4, T<= 500.
这个题的解题思路非常nice
思路:分别枚举X[1], X[2]和X[3], X[4]. 然后将P - AX[1] - BX[2]计算出来并存到hash表中,然后再计算CX[3] + DX[4], 然后每次去hash表中查询是否可行。
hash表小知识点
一、hash方法:
①整一个vector vet[N], N的大小为mod,然后将
d = a[i]%mod依次存放到vet[d]中。这样的一个好处就是,查询数据的时候,可以对每一个vet[i]排序,然后二分查找(是按复杂度应该还行)。
②开一个大小为mod的数组hash[N],然后每次计算出来
d = a[i]%mod, 然后找到hash[d],看该位置是否为空,如果不为空,就从hash[d]开始找到第一个为空的位置存放a[i]。
本文作者:风归去
本文链接:https://www.cnblogs.com/N-lim/p/16890665.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2021-11-14 优先队列重载