【模板】通配符单模式串匹配 -FFT bzoj4259: 残缺的字符串

本文介绍了如何使用快速傅里叶变换(FFT)解决带通配符的字符串匹配问题,通过将匹配条件转化为卷积形式并利用FFT进行高效计算,解决了无法直接应用KMP算法的情况。具体步骤包括将模式串转换、建立匹配条件和执行7次FFT运算。
摘要由CSDN通过智能技术生成

传送门: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=0T1(SxiTT1i)2SxiTT1i=0(1)

S x − i = 0 , T ∣ T ∣ − 1 − i = 0 S_{x-i}=0,T_{|T|-1-i}=0 Sxi=</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值