匹配统计

这个是对f[i]数组的扩展,f[i]求的是A的后缀与B的前缀匹配的最大长度,而这道题目是求A的前缀与B的前缀匹配的最大长度

注意不能简单地将A翻转然后跑KMP,因为A翻转了匹配的方向不会翻转。比如说ABCAB匹配长度为2,反转后为CBA,(用KMP求出的)匹配长度显然为0,但我们想要的还是2

这道题目有hash+二分的做法,比较好想,下面介绍KMP的做法

我们先考虑一个暴力的做法,我们把B挨个挨个从A的某个位置开始进行匹配,看最多能匹配多少个,设为x,然后把cnt[x]++,最后查询的时候直接输出cnt[x]即可;但是为了利用KMP,我们不这么做暴力,而是对每次的x,将cnt[1],cnt[2],...,cnt[x]都加一。统计答案x时,考虑cnt[x],显然此时cnt[x]多加了,多余的部分是因为匹配长度恰好x+1,x+2,x+3...的时候让cnt[x]增加了,于是我们减掉这些增加的量就是答案,此时利用后缀和思想即可

那我们怎么用KMP呢?我们考虑利用f[i]这个数组

接下来就看看这篇题解

这篇题解怎么保证不重不漏呢?考虑我们上面的暴力算法,在暴力的过程中,我们给每一个匹配长度分类,如下

假设某一次AB如上,橙色方块是能匹配的最大长度,假设是4

那我们朴素的加cnt数组的话,就要给cnt[14]都加1,我们如果以每一个长度的末尾为标准,将每一个长度放到这个标准以内,比如

我们将B[11]分配给A[i]这个位置,B[12]分配给A[i+1]这个位置,B[13]分配给A[i+2]这个位置

那么在暴力的过程后A[i]就有对应的分配了,然后在题解中,我们对A[i]做那个循环加法,就相当于给A[i]分配的每一个长度的cnt做加法,此时就可以知道是不重不漏的

posted @   最爱丁珰  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示