1. 程式人生 > >【BZOJ】4259: 殘缺的字符串

【BZOJ】4259: 殘缺的字符串

題解 個數 題意 裏的 就是 嘗試 -s span 字符

【題意】給定長度為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: 殘缺的字符串