刷题系列——字符串

哈希 hash

h i = j = 1 i s j × p i j + 1 h_i = \sum_{j=1}^i s_j \times p^{i - j + 1}

for (int i = 1; i <= n; i++) h[i] = (h[i - 1] * p + s[i]) % mod;
//p = 131
//mod = 1e9 + 7
  • 求一个子串的 hash 值

h l , r = j = l r s j × p r j + 1 h l 1 = j = 1 l 1 s j × p l j h r = j = 1 r s j × p r j + 1 p r j + 1 p l j = p r l + 1 h l , r = h r h l 1 × p r l + 1 h_{l,r} = \sum_{j=l}^rs_j \times p^{r - j + 1}\\ h_{l -1} = \sum_{j=1}^{l-1} s_j \times p^{l - j}\\ h_r = \sum_{j=1}^r s_j \times p^{r - j + 1}\\ \quad\\ \frac{p^{r-j + 1}}{p^{l - j}} = p^{r -l+1} \quad\\ \quad\\ h_{l,r} = h_r - h_{l-1} \times p^{r - l + 1}

  • h 2 h_2 拼接在 h 1 h_1 后的 hash 值

h = h 1 + h 2 × p size ( h 1 ) h = h_1 + h_2 \times p^{\operatorname{size}(h_1)}

  • 比较 h 1 h_1 h 2 h_2 的字典序大小

二分找到第一位不相等的,用 hash 来 check。 O ( log n ) O(\log n)

Kmp

AC 自动机

接下来是没有讲的内容

后缀自动机

马拉车

猜你喜欢

转载自blog.csdn.net/qq_39984146/article/details/107661832