exKMP 学习小记

来源:互联网 发布:安卓大尺度直播软件 编辑:程序博客网 时间:2024/06/06 01:06

Text

给定文本串S,模板串T
n=|S|,m=|T|
数组ex[i]表示S以i这个位置开头的后缀与T的最长公共前缀的长度
要求在线性的时间内求出ext[1..n]
显然,若某个ext[i]=m,那么说明找到了一个T
因此我们将其看作KMP问题的扩展

实际上这个算法与KMP完全不同,个人认为它反而与manacher有几分神似

设辅助数组next[i]表示T中以i这个位置开始的后缀和T的最长公共前缀的长度

假设ext[1~i-1]都算出来了,考虑要求ext[i]
设ext[1~i-1]向右匹配最右延伸到了p这个位置,严格的说p=max(id+ext[id]1),1<=id<i
那么S[id~p]和T[1~p-id+1]是已经匹配了的
也就是说S[i~p]和T[i-id+1~p-id+1]是已经匹配了的

设len=next[i-id+1]
分情况讨论

如果len+i1<=p,那么ext[i]=len

如果len+i1>p,那么ext[i]至少是p-i+1,只需要从这个位置继续暴力匹配,并更新p

真的和manacher有几分神似。。

那么现在问题就是求next
发现next就是T和自己做exKMP,类似处理。就这一点来讲又像KMP

分析复杂度
十分 肯定 的,匹配失败的次数是O(n)的,每匹配成功一次,p都会向右移一位,p的右移次数是n,所以总复杂度也是O(N)的