洛谷P4173 残缺的字符串(FFT匹配字符串)

本文探讨了如何利用傅立叶变换(FFT)优化完整和模糊字符串匹配的问题。首先介绍了完整匹配的必要条件,并通过平方操作确保增量为正,简化为可以使用FFT处理的卷积问题。接着,讨论了模糊匹配的实现,其中'*'字符可以匹配任意字符,导致匹配函数的调整,最终得出的表达式虽然无法直接线性处理,但依然可以通过多次卷积保持O(n log n)的时间复杂度。文章最后提供了相关代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先考虑完整两串的匹配(我知道可以kmp,但是模糊匹配的思路需要从这里引出
假设短串a长为lena长串b长为lenb
我们知道两串如果完整匹配,他们每一个位置都要相同,即 a [ i ] − b [ y + i ] = 0 a[i]-b[y+i]=0 a[i]b[y+i]=0
所以说a要完整匹配要满足:
∑ i = 0 l e n a a [ i ] − b [ y + i ] = 0 \sum_{i=0}^{lena} a[i]-b[y+i]=0 i=0lenaa[i]b[y+i]=0
这是必要条件,不是充分条件,因为我们发现bd和cc按这种规则也能匹配,为了使偏差的增量恒为正,我们给他平方一下
∑ i = 0 l e n a ( a [ i ] − b [ y + i ] ) 2 = 0 \sum_{i=0}^{lena} (a[i]-b[y+i])^2=0 i=0lena(a[i]b[y+i])2=0
这个时候复杂度显然是n^2的,考虑优化,我们把短串反转记为c,则 a [ i ] = c [ l e n a − i ] a[i]=c[lena-i] a[i]=c[lenai]
∑ i = 0 l e n a ( c [ l e n a − i ] − b [ y + i ] ) 2 = 0 \sum_{i=0}^{lena} (c[lena-i]-b[y+i])^2=0 i=0lena(c[lenai]b[y+i])2=0
∑ i = 0 l e n a ( c [ l e n a − i ] ) 2 + ∑ i = 0 l e n a ( b [ y + i ] ) 2 − 2 ∑ i = 0 l e n a ( c [ l e n a − i ] b [ y + i ] ) = 0 \sum_{i=0}^{lena} (c[lena-i])^2+\sum_{i=0}^{lena}(b[y+i])^2-2\sum_{i=0}^{lena}(c[lena-i]b[y+i])=0 i=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值