记录
23:40 2024-2-5
1. 字符串hash
将字符串转换为hash值。以p=131/13331,将字符串看成P进制数,取一固定值M,求出该P进制数对M的余数,作为该字符的hash值。
可以取M = \(2^{64}\) 用 unsigned long long存储这个hash值,这样不用取模,因为如果溢出了就相当于对\(2^{64}\)取模了
除了在极特殊构造的数据上, 上述 Hash 算法很难产生冲突, 一般情况下上述 Hash算法完全可以出现在题目的标准解答中。
点击查看代码
// s字符串
char s[1000010];
// f 前缀字符串的哈希值 p 131^i
unsigned long long f[1000010], p[1000010];
int n, q;
int main() {
scanf("%s", s + 1);
n = strlen(s + 1);
cin >> q;
p[0] = 1; // 131^0
for (int i = 1; i <= n; i++) {
f[i] = f[i-1] * 131 + (s[i]-'a'+1); // hash of 1~i
p[i] = p[i-1] * 131; // 131^i
}
// hash of [l, r]
// f[r] - f[l-1] * p[r-l+1]
}