EXKMP

马拉车和KMP的合并版——EXKMP

思路

目标解决:给定串\(S\)\(T\),求出\(S\)的每个后缀与\(T\)的最长公共前缀。时间复杂度:线性。

\(extend[i]\)表示\(S[i..n]\)\(T\)的最长公共前缀。

设现在\(extend[1..k-1]\)均算好,在之前\(i+extend[i]-1\)的最大值为\(p\),即\(S\)之前最远匹配到的位置,同时设\(i+extend[i]-1\)为最大值\(p\)\(i\)\(a\)

我们知道\(S[a..p]=T[1..p-a+1]\)
那么\(S[k..p]=T[k-a+1..p-a+1]\)

假如我知道\(t[k-a+1..m]\)\(T\)的最长公共前缀就好了……于是,设\(next[i]\)表示\(t[i..n]\)\(T\)的最长公共前缀。

假如\(k+extend[k-a+1]-1<p\),显然\(extend[k]=next[k-a+1]\)

假如\(k+next[k-a+1]-1>=p\),我们只知道\(S[k..p]=T[1..p-k+1]\),并不知道\(S[p+1..k+next[k-a+1]-1]\)是否与\(T[p-a+2..k-a+next[k-a+1]]\)相等,与马拉车同理,从\(p+1\)开始暴力匹配.

由于\(S\)\(T\)的每个位置都只会被扫一遍,所以时间复杂度是线性的。

next数组的处理见KMP.

代码(待更)

posted @ 2019-08-11 10:22  featherZHY  阅读(159)  评论(0编辑  收藏  举报