p4173-solution

P4173 Solution

link

对于一般的字符串匹配,我们可以用 FFT 在线性对数复杂度内解决。

对于这题,我们无法用常用的 KMP 算法解决。考虑对原先的 FFT 匹配算法进行一些修改。

原先 \(t\) 能够匹配 \(s\) 中以第 \(x\) 位结尾的 \(m\) 个字符当且仅当 \(\sum_{i=0}^{m-1}(s_{x-m+1+i}-t_i)^2=0\)

\(\forall i\in[0,m-1],s_{x-m+1+i}=t_i\)

\(\displaystyle f(x)=\sum_{i=0}^{m-1}(s_{x-m+1+i}-t_i)^2=\sum_{i=0}^{m-1}(s_{x-m+1+i}-t^R_{m-1-i})^2\)

\[=\sum_{i=0}^{m-1}s_{x-m+1+i}^2+t_{m-1-i}^{R2}-2s_{x-m+1+i}t^R_{m-1-i} \]

注意到第三项的下标之和为 \(m\),那我们用 FFT/NTT 优化就可以做到线性对数。

回到这题。这题由于有万能符的存在,万能符与任何字符匹配都能匹配上。

那么我们考虑设万能符的值为 \(0\),那么匹配的式子变为

\[\begin{aligned} f(x)&=\sum_{i=0}^{m-1}(s_{x-m+1+i}-t_i)^2s_{x-m+1+i}t_i\\ &=\sum_{i=0}^{m-1}(s_{x-m+1+i}-t^R_{m-1-i})^2s_{x-m+1+i}t^R_{m-1-i}\\ &=\sum_{i=0}^{m-1}s_{x-m+1+i}^3t^R_{m-1-i}+s_{x-m+1+i}t_{m-1-i}^{R3}-2s^2_{x-m+1+i}t^{R2}_{m-1-i} \end{aligned}\]

你发现到这里三个部分都可以卷积计算,那么此题就在线性对数时间内解决了。

posted @ 2024-03-01 09:03  iorit  阅读(4)  评论(0)    收藏  举报