今天研究了一下杭电 1358题,感觉最小循环子串的问题的重点是理解为什么 len%(len-next[i])==0 可以得出最小循环子串。
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-