也是第一次知道还有扩展KMP这种东西,先把自己目前的理解写一下吧。
设S为母串, P为子串,扩展KMP有两个辅助数组,nex[ i ]表示P串 i 开头后缀与P原串的最长公共前缀,extend[ i ]表示S串 i 开头后缀与P串最长公共前缀。
设S为母串, P为子串,扩展KMP有两个辅助数组,nex[ i ]表示P串 i 开头后缀与P原串的最长公共前缀,extend[ i ]表示S串 i 开头后缀与P串最长公共前缀。
箬蒻的胡乱理解:
在求extend过程中:
一,初始化,对于ex[ 0 ]暴力枚举找到适配位置,设置p0为0
二,对于大于0的位置 i ,此时已知extend[i-1],则
注:在S字符串中位置前后关系:p0 , i
S[ ( p0 ) ~ ( p0+nex[ p0 ] ) ] = P [ 0 ~ nex[ p0 ] ]
然后就是一些数学操作(误)
S[ i ~ p0 + ex[ p0 ] ] = P[ i - p0 ~ ex[ p0 ] ] ①(这里要判断 i - p0 是否还小于等于 nex[ p0 ],有点不理解
P[ i - p0 ~ i - p0 +nex[ i - p0 ] ] = P[ 0 ~ nex[ i - p0 ] ] ②
下面开始分情况讨论,
1,如果 i - p0 +nex[ i - p0 ] < ex[ p0 ] ,由① ②式可得S[ i ~ i + nex[ i - p0 ] ] = P[ 0 ~ nex[ i - p0 ] ],
且不可能延申至更远了,否则nex[ i - p0 ]也会相应变大
2,如果 i - p0 +nex[ i - p0 ] >= ex[ p0 ] ,此时一定有S[ i ~ p0 + ex[ p0 ] ] = P[ 0 ~ p0 + ex[ p0 ] - i ],
但是答案可能延申更远,这是就要从 len =p0 + ex[ p0 ] - i ( len代表最长公共前缀长度)开始暴力枚举,同时更新 p0 值。
且不可能延申至更远了,否则nex[ i - p0 ]也会相应变大
2,如果 i - p0 +nex[ i - p0 ] >= ex[ p0 ] ,此时一定有S[ i ~ p0 + ex[ p0 ] ] = P[ 0 ~ p0 + ex[ p0 ] - i ],
但是答案可能延申更远,这是就要从 len =p0 + ex[ p0 ] - i ( len代表最长公共前缀长度)开始暴力枚举,同时更新 p0 值。
不理解的地方:‘
如果i>extend[po]+po则要从头开始匹配,完全想象不出这是什么情况啊,,,为啥就从头匹配了。。
代更