有关字符串循环节的一些性质

我们最常用的求一个字符串循环的算法是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级别的,但是遇到了瓶颈啊。。。

posted @ 2019-01-10 14:25  asd123www  阅读(1102)  评论(0编辑  收藏  举报