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: 残缺的字符串的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ4259 残缺的字符串 多项式 FFT

@bzoj - 4259@ 残缺的字符串

bzoj4259: 残缺的字符串

bzoj4259: 残缺的字符串

BZOJ 4259 残缺的字符串 ——FFT

Bzoj4259 残缺的字符串