字符串哈希

 1 核心思想:将字符串看成P进制数,P的经验值是131或13331,取这两个值的冲突概率低
 2 小技巧:取模的数用2^64,这样直接用unsigned long long存储,溢出的结果就是取模的结果
 3 
 4 typedef unsigned long long ULL;
 5 ULL h[N], p[N]; // h[k]存储字符串前k个字母的哈希值, p[k]存储 P^k mod 2^64
 6 
 7 // 初始化
 8 p[0] = 1;
 9 for (int i = 1; i <= n; i ++ )
10 {
11     h[i] = h[i - 1] * P + str[i];
12     p[i] = p[i - 1] * P;
13 }
14 
15 // 计算子串 str[l ~ r] 的哈希值
16 ULL get(int l, int r)
17 {
18     return h[r] - h[l - 1] * p[r - l + 1];
19 }

 

posted @ 2021-12-28 21:24  Jinxiaobo0509  阅读(59)  评论(0)    收藏  举报