哈希表
存储结构:
1. 开放寻址法
2. 拉链法
字符串哈希用途
利用字符串前缀哈希方法快速判断同一个字符串两个不同区间的字符串是否相等.
如果hash值相等则认为两个区间的字符串相同,否则不相等
时间复杂度$O(1)$
主要步骤
step1: 把字符串看成P进制数
step2:预处理字符串所有的前缀hash值, hash[i] = (hash[i - 1] * P + str[i]) mod Q
step3: 计算区间hash值hash[l, r] = hash[r] - hash[l-1] * p[r - l + 1]
前人经验:P一般取 131 或者 13331, Q 取 $2 ^ {64} $, 冲突概率小
主要注意点
技巧:由于 Q 取 $2^{64}$次方,可以直接用 unsigned long long 存 h[N]、p[N], 相当于取模
注意:计算时候需要用到 P的 n次方,需要预处理,p[0] = 1
代码模板
typedef unsigned long long ULL;
const int P = 131;//P进制
ULL h[N], p[N];//p[i] 表示 p 的 i 方.
//计算指定区间字符串的哈希值
ULL get_hash(int l, int r)
{
return h[r] - h[l-1] * p[r - l + 1];
}
p[0] = 1;
for(int i = 1; i <= n; i++)
{
p[i] = p[i - 1] * P;//计算p的i方
h[i] = h[i - 1] * P + str[i];//计算下标以i为结尾的子串的哈希值
}