1. 程式人生 > >luogu P4173 殘缺的字串(坑)

luogu P4173 殘缺的字串(坑)

背景:

FFT的字串假題。

題目傳送門:

https://www.luogu.org/problemnew/show/P4173

題意:

定義 * 表示一個任意字元,求一個字串從哪裡開始能在模式串完全匹配。

思路:

考慮轉化為數字問題。
0

0 表示 * 1 1 表示字元 a a
2 2 表示字元 b b
考慮一一對應。
那麼假設兩個位置匹配,就會有 a
i b i = 0 |a_i-b_i|=0
a i = 0 a_i=0 b i = 0 b_i=0 ,就可以表示為: ( a i b i ) 2 a i b i = 0 (a_i-b_i)^2a_ib_i=0

展開化簡得: a i 2 a i b i + b i 2 a i b i 2 a i b i a i b i = 0 a_i^2*a_ib_i+b_i^2*a_ib_i-2a_ib_i*a_ib_i=0

a i 3 b i + a i b i 3 2 a i 2 b i 2 = 0 a_i^3b_i+a_ib_i^3-2a_i^2b_i^2=0

不妨設 b b' b b 反向取後的序列,則有:
a i 3 b n i + a i b n i 3 2 a i 2 b n i 2 = 0 a_i^3b_{n-i}+a_ib_{n-i}^3-2a_i^2b_{n-i}^2=0

發現是三個 F F T FFT 卷積的形式,不妨用 F F T FFT 來加速即可。

程式碼: