扩展KMP
exkmpexkmpexkmp 求解的问题:对于给定的主串 SSS ,和模式串 TTT ,求出主串 SSS 的所有后缀与模式串 TTT 的最长公共前缀长度。
KMPKMPKMP 求解的问题是在主串 SSS 中模式串T出现的次数和位置,扩展KMP扩展KMP扩展KMP 求解问题包含了 KMPKMPKMP 求解的问题,因为主串 SSS 中与模式串 TTT 的最长公共前缀长度等于 ∣T∣|T|∣T∣ 的后缀就是 KMPKMPKMP 所求。
exkmpexkmpexkmp 算法求解过程实际是求两个数组的值:
net[i]net[i]net[i] : 模式串 TTT 的后缀 Tsuf(i)Tsuf(i)Tsuf(i) 与模式串 TTT 本身的最长公共前缀长度 (net指next,C++11中next为保留字)
extend[i]extend[i]extend[i]:主串 SSS 的后缀 Ssuf(i)Ssuf(i)Ssuf(i) 与模式串 TTT 的最长公共前缀长度
exkmp算法采用 递推求解 , extend[i]extend[i]extend[i] 的值可以由 extend[0..i]extend[0..i]extend[0..i] 和 netnetnet 数组的值求得。
算法推导:
设:主串 SSS ,长度 NNN ,模式串 TTT ,长度 MMM ,下标均从 000 开始。
假设 extend[0..i]extend[0..i]extend[0..i] 和 netnetnet 数组已知,现在正在求解 extend[k]extend[k]extend[k] 的值
设最远匹配位置为 ppp (即主串 SSS 下标分别从 000 ~ K+1K+1K+