next[i]是kmp初始化的一个数组。

从我画的这个图中 可以看出,因为len%(len-next[i])==0 我们可以把len-next[i] 看成是一个整体,当成一个块,比如上图的S[i-1](说明一下,这个S中的下标i和next[i]不是一样的),因为整除,我们可以把len分成n个块,这样只要证明每个快都相等,我们就可以得出len-next[i]是其中的一个循环子串,S[i-1] = S[i-1](上下两个数组是相同的),根据next数组的含义我们可以得出 s[i-2] = s[i-1] 。。。。。s[2] = s[3] s[1] = s[2].所以我们可以得出 S[i-1] = s[i-2] =s[i-3] ......s[1],所以S[i-1] 也就是len-next[i]这个块可以作为一个循环子串,循环次数为len/(len-next[i])。
下面就是证明为什么len-next[i]是最小的子串,我们可以假设有一个比S[i-1]更小的子串,这样我们可以把整个串分成更多的子串,因为每个子串都是相等的,根据next[i]的意思,我们可以知道这时候的next[i] 等于 原来的next[i] + *以前的子串-现在小的子串),所以可以知道len-next[i]为最小的循环子串。
写的比较乱,是自己的一些理解,附上杭电1358题

通过KMP算法分析,发现最小循环子串可以通过len%(len-next[i])==0的关系来确定,将len-next[i]视为一个整体。利用next数组的性质证明每个块相等,从而得出S[i-1]作为循环子串。进一步论证,证明len-next[i]是最小的循环子串,因为它不能被更小的子串所替代,否则next[i]会改变。该理解来源于杭电1358题的解题思路。
最低0.47元/天 解锁文章

3350

被折叠的 条评论
为什么被折叠?



