丸辣——day?字符串
字符串哈希
考虑字符串 \(S\),如何哈希?
有以下方法:
\[\large
\begin{aligned}
S=(\sum\limits_{i=1}^{\lvert S \rvert} S_{i} \times B^{\lvert S \rvert - i})\mod P
\end{aligned}
\]
$ B $ 和 $ P $ 可以自定,但最好都取质数,lyd 的做法 $ P $ 取 $ 2^{64} $,即让 unsigned long long 自行溢出,但是自然溢出或以 \(x\) 为底数的数都很容易被卡。
如果不是被对着卡,出错的概率是 \(\frac{1}{P}\)。
以下介绍用法:
兔子与兔子
给出一个字符串 \(S\) 和 \(Q\) 次询问 \((l1,r1,l2,r2)\) 询问 \(S[l1,r1]\) 是否等于$ S[l2,r2]$。
考虑字符串哈希,求出每个前缀,使用类似前缀和的思路。
那么一个区间的哈希值即为:
\[\large
\begin{aligned}
h_{r}-h_{l-1} \times B^{(r-l+1)}
\end{aligned}
\]
然后就做完了。
[TJOI2017] DNA
给出字符串 \(S_{0}\) 与 \(S\),问 \(S_{0}\) 中有多少子串与 \(S\) 只有 \(3\) 个字符以内的差距。
对于 \(S_{0}\) 中任意一个长度为 $ \lvert S \rvert$ 的子串,通过哈希二分第一个与 \(S\) 有差距的字符,然后再对那个字符后的区间继续做刚刚的操作,直到发现差距超过三或者没有不同的字符了,注意对负数取模的情况。
时间复杂度 $O(n\log n) $
那这道题就做完了。

浙公网安备 33010602011771号