字符串哈希(进制哈希)
把字符串通过哈希函数映射成一个数,类似进制的方法处理即可。
下文我们约束字符串为 $str$,长度分别为 $n$,以 $1$ 为起始下标。
类比成 $base$ 进制的理解,有:
$$hash(str)=\sum_{i=1}^{n} str_i \times base^{n-i}$$
利用前缀和的性质,设 $h_i$ 为字符串 $str$ 的前 $i$ 位的哈希值,这样可以高效表示哈希值。
不难得出:$h_i=h_{i-1} \times base + str_i$。可以类似秦九韶公式去理解。
于是,对于 $[L, R]$ 内的哈希值有: $h_R-h_{L-1} \times base^{R-L+1}$。
相当于把进制补齐,因为在算到 $h_R$ 时 $h_{L-1}$ 的哈希值共被累乘了 $base^{R-(L-1)}$。
而现在想得到 $[L, R]$ 内的哈希值,用 $h_R$ 的哈希值直接减去 $h_{L-1}$ 的哈希值时,需要先把 $h_{L-1}$ 的哈希值补回来。