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.