[笔记] 字符串哈希
Hash 的思想
Hash 的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。
这里的 “值域较小” 在不同情况下意义不同。
在哈希表中,值域需要小到能够接受线性的空间与时间复杂度。
在字符串哈希中,值域需要小到能够快速比较。
同时,为了降低哈希冲突率,值域也不能太小。
Hash 的实现
预处理前缀 hash 值:
for(int i = 1; i <= n; ++i) h[i] = ((LL) h[i - 1] * base % mod + s[i]) % mod;
获取子串 \(s(l,r)\) 的hash 值:
h[r] - h[l - 1] * qpow(base, r - l + 1);
Hash 的应用
- 字符串题目中的应用;
- 判断一个括号串的某个区间是否是合法串,用 hash 判断经过这个区间前后栈的情况是否一致;
- 通过二分求 lcp,在很多需要比较的解题中被使用。