p4173-solution
P4173 Solution
对于一般的字符串匹配,我们可以用 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}\]
你发现到这里三个部分都可以卷积计算,那么此题就在线性对数时间内解决了。
                    
                
                
            
        
浙公网安备 33010602011771号