有关字符串循环节的一些性质
我们最常用的求一个字符串循环的算法是kmp。
结论:
设$len=n-nxt[n]$
(1) $nxt[n]=0$ 不存在循环节
(2) $nxt[n]>0$ $\&\&$ $n\%len\neq0$ 存在循环节但是长度不整除
(3) $nxt[n]>0$ $\&\&$ $n\%len=0$ 存在整除循环节
而且更长的循环节一定是$len$的倍数。
证明1:若为(2),那么不存在一个长度更长的循环节使其整除。
一个小性质:对于(2),(3)情况,则$\forall 1\leq l \leq r \leq n$,$S[l,r]$满足(2),当$(r-l+1)\%len=0$时满足(3)。
考虑反证法,证明不存在整除循环节$len$,满足$\exists nxt[n]>n-len$。
(1)$len\%(n-nxt[n])=0$,显然矛盾。
(2)$len\%(n-nxt[n])\neq 0$,设$x=n-nxt[n]$。
$S[1,len]$和$S[len+1,2*len]$之间产生$S[1,x]$的前后缀相等,设其长度为pre。
考虑证明$nxt[n]=n-x+pre$,只需证明$S[x-pre+1,2*x-pre]=S[1,x]$即可,也是用$S[1,len]$和$S[len +1,2*len]$交叉的证明。
都推出了矛盾就证完了。
证明2:若(1),则所有整除循环节长度是$len$的倍数。
证明与证明1非常类似,都是以推出更长循环节为矛盾的。
但有时我们并不满足于对于一个串$|S|$以$O(n^2)$的复杂度搞出所有子串的循环节。
设以$i$为左端点开始的子串不同最小循环节的个数为$g(i)$。
结论:$\sum_{i=1}^{n}g(i)$是$n*logn$级别的。
证明:我想证明$g(i)$是logn级别的,但是遇到了瓶颈啊。。。