BZOJ4259: 残缺的字符串
Posted ONION_CYC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ4259: 残缺的字符串相关的知识,希望对你有一定的参考价值。
【题意】给定长度为m的匹配串B和长度为n的模板串A,求B在A中出现多少次。字符串仅由小写字母和通配符" * "组成,其中通配符可以充当任意一个字符。n<=3*10^5。
【算法】FFT
【题解】假设模板串的数组A用0~26代表所有字符,0为通配符,匹配串的数组B同理,那么用表示差异的经典套路:
$$C_n=\sum_{i=0}^{m-1}(A_{n+i}-B_i)^2*A_{n+i}*B_i$$
那么可以看出$C_n=0$当且仅当$S_A[n,n+m-1]=S_B[0,m-1]$。这里的通配符为0,所以当含有通配符时式子直接为0,即无差异。
尝试扩展上届,由于:
$$B_i=0,i\in[m,n]$$
所以可以得到:
$$C_n=\sum_{i=0}^{n}A_{n+i}^3B_i-2A_{n+i}^2B_i^2+A_{n+i}Bi^3$$
这就是标准的卷积形式了,将其中一个数组反转即可。
复杂度O(n log n)。
以上是关于BZOJ4259: 残缺的字符串的主要内容,如果未能解决你的问题,请参考以下文章