字符串哈希学习记录
什么是字符串哈希
字符串哈希就是建立一种映射关系,将一段字符串映射到一个数字值上。这种映射关系满足 映射数字不同的字符串一定不同,但映射数字相同的字符串可能相同(这种情况被称为哈希碰撞)
怎么实现字符串哈希
通常是将字符串按位加入到一个函数中,最后运算得到的结果就是字符串的哈希值。比较常用的哈希办法是HASH=∑bi*si 或者反过来,最后对一个很大的质数取模。
字符串哈希的时间复杂度
一般来说,将两个没有关系的字符串哈希后比较值跟直接暴力匹配没有区别,但是如果每次需要比较的只是一个字符串的子串,那么就可以对字符串整体进行O(n)预处理后O(1)时间给出任意子串的哈希值。
代码实现
#include <bits/stdc++.h> typedef long long ll; using namespace std; const int MAXN = 6e5 + 5; const ll MOD1 = 1e9 + 7; const ll MOD2 = 998244353; const ll b = 114514; ll b1[MAXN], b2[MAXN]; void init() { b1[1] = b2[1] = b; for (ll i = 2; i < MAXN; i++) { b1[i] = (b1[i - 1] * b) % MOD1; b2[i] = (b2[i - 1] * b) % MOD2; } } struct SHASH { ll f1[MAXN], f2[MAXN], slen; void init(ll *str,ll slen) { ll s = str; f1[1] = f2[1] = s[1]; for (ll i = 2; i <= slen; i++) { f1[i] = ((f1[i - 1] * b) % MOD1 + s[i]) % MOD1; f2[i] = ((f2[i - 1] * b) % MOD2 + s[i]) % MOD2; } return; } ll hash1(ll l, ll r) { return ((f1[r] - (f1[l - 1] * b1[r - l + 1]) % MOD1 + MOD1) % MOD1); } ll hash2(ll l, ll r) { return ((f2[r] - (f2[l - 1] * b2[r - l + 1]) % MOD2 + MOD2) % MOD2); } };

浙公网安备 33010602011771号