两种哈希的表示方式。
设 $s_i$ 为字符串内第 $i$ 位,$h_i$ 表示字符串内 $[1,i]$ 的哈希值,$p$ 为模数,那么第一种哈希方式是 :
- $h_i=h_{i-1}*p+s_i$,即把 $h_i$ 当作一个 $p$ 进制数,加入 $s_i$ 时在数的末尾。
- $h_i=h_{i-1}+s_i*p^{i-1}$,即是在开头加入 $s_i$。
如何查询呢?
- 对于第一种,我们相当于要先把 $s_j$ 后面的剪掉,再把 $s_i$ 前面的剪掉,于是区间 $[i,j]$ 的哈希值为 $h_j-h_{i-1}\times p^{j-i+1}$。
- 对于第二种,我们相当于把 $s_j$ 的前面和 $s_i$ 的后面剪掉,于是即为 $\frac{h_j-h_{i-1}}{p^{i-1}}$。
相关题目:
- ABC331F
- P2757 [国家集训队] 等差子序列
- P4503 [CTSC 2014] 企鹅 QQ