传送门:bzoj4259
题解
带通配符的字符串匹配无法有效地用 k m p kmp kmp处理,这时大常数的 F F T FFT FFT派上了用场。
这题已经升级为一种套路/模板了,暂且引用ebola’s题解的称呼:带通配符的单模式串匹配。
设模式串为 T T T,文本串为 S S S。“*”对应0, a , b , . . . , z a,b,...,z a,b,...,z分别对应 1 , 2 , . . . , 26 1,2,...,26 1,2,...,26。
为便于叙述和进行FFT,设字符串下标均从0开始。
假设在 S S S中以 x x x位置结尾的长度为 ∣ T ∣ |T| ∣T∣的子串能匹配上 ∣ T ∣ |T| ∣T∣,则:
(1) ∑ i = 0 ∣ T ∣ − 1 ( S x − i − T ∣ T ∣ − 1 − i ) 2 S x − i T ∣ T ∣ − 1 − i = 0 \sum\limits_{i=0}^{|T|-1}(S_{x-i}-T_{|T|-1-i})^2S_{x-i}T_{|T|-1-i}=0\tag 1 i=0∑∣T∣−1(Sx−i−T∣T∣−1−i)2Sx−iT∣T∣−1−i=0(1)
S x − i = 0 , T ∣ T ∣ − 1 − i = 0 S_{x-i}=0,T_{|T|-1-i}=0 Sx−i=</