丸辣——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) $

那这道题就做完了。

posted @ 2024-08-07 21:49  PM_pro  阅读(13)  评论(0)    收藏  举报