都是一个类型的题,1961是2406的加强版
下面举个例子来说明一下l/(l-next[l])就是重复次数
i 1 2 3 4 5 6 7
s: a b c c c a b
next: 0 0 0 0 0 1 2
l-next[l]=5,就相当于现在我们得到了s的一个子串:abccc
显然这里拿abcccab去除abccc的结果是 商1余ab是除不尽的,所以l%(l-next[l])!=0时是不存在最小重复子串的
而我们这里得到的abccc是可能 的最小重复子串
下面来证明一下:
假设有这么一个字符串
如果s[a..b]==s[c...d],也就是说,b..c没有被算进去,就是a..c没有前缀和后缀是一样的,很显然next[d]的值肯定是小于l/2的。
l%(l-next[l])!=0.这样的字符串是不存在最小重复子串的就像前面说的abcccab就是这种类型
如果存在最小重复子串那么,next[d]就可以有next[a..b]也就是可以由前面的next[]来构成我们在构造next时候就是这么构造的,
if(B[j+1]==B[i])
j++;
这里l-next[l]得到的就是a...b因为后面的next都可以由前面的得到,那么b..d肯定也是有a..b组成的,a..b就是它的最小重复子串。
重复次数就是l/(l-next[l])