码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ】4259: 残缺的字符串

时间:2018-04-16 20:35:32      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:题解   标准   就是   sum   fft   zoj   算法   span   font   

【题意】给定长度为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)。

 

【BZOJ】4259: 残缺的字符串

标签:题解   标准   就是   sum   fft   zoj   算法   span   font   

原文地址:https://www.cnblogs.com/onioncyc/p/8858083.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!