|
|
@@ -30,7 +30,7 @@ acbacabacbacb
|
|
|
^
|
|
|
```
|
|
|
|
|
|
-假设我们已经求出$nxt_{12}=5, \; nxt_5=2$,当前两个指针分别指向$S_{12}$和$S_{nxt_{12}}=S_5$,求$nxt_{13}$。在这里,两个指向$S_p, S_q$的指针表示$S_{p-q+1, p}=S_{1, q}$。
|
|
|
+假设我们已经求出$nxt_{12}=5, \ nxt_5=2$,当前两个指针分别指向$S_{12}$和$S_{nxt_{12}}=S_5$,求$nxt_{13}$。在这里,两个指向$S_p, S_q$的指针表示$S_{p-q+1, p}=S_{1, q}$。
|
|
|
|
|
|
比较两个指针的后一位。易知,若$S_{13}=S_6$,则$nxt_{13}=nxt_{12}+1=6$,可以将两个指针都向后移一位。
|
|
|
|
|
|
@@ -79,12 +79,12 @@ KMP 算法除了可以用于字符串匹配,还能求出一个循环串的最
|
|
|
>
|
|
|
> 当$(|A|) \nmid (|B|)$时,令$k=\left\lfloor {|B| \over |A|} \right\rfloor$。
|
|
|
>
|
|
|
-> 考虑字符串$S=AB, \; T=S_{(k-1)|A|+1, |S|}$,可知$T_{1, |A|}=T_{|T|-|A|+1, |T|}=A, \; T_{1, |T|-|A|}=T_{|A|+1, |T|}=B_{(k-1)|A|+1, |B|}$。令$A'=B_{(k-1)|A|+1, |B|}, \; B'=A$,那么我们又得到了$A'B'=B'A'$的形式,此时$|A'|=|B| \bmod |A|, \; |B'|=|A|$。因此,最后一定能得到长为$(|A|, |B|)$的字符串,它是$A, B$的一个循环节,也是$AB$的一个循环节。
|
|
|
+> 考虑字符串$S=AB, \ T=S_{(k-1)|A|+1, |S|}$,可知$T_{1, |A|}=T_{|T|-|A|+1, |T|}=A, \ T_{1, |T|-|A|}=T_{|A|+1, |T|}=B_{(k-1)|A|+1, |B|}$。令$A'=B_{(k-1)|A|+1, |B|}, \ B'=A$,那么我们又得到了$A'B'=B'A'$的形式,此时$|A'|=|B| \bmod |A|, \ |B'|=|A|$。因此,最后一定能得到长为$(|A|, |B|)$的字符串,它是$A, B$的一个循环节,也是$AB$的一个循环节。
|
|
|
|
|
|
- **引理 3** 若字符串$S$是循环串,则$S$的最小循环节是$S_{1, i-nxt_i}$。
|
|
|
|
|
|
> **证明** 令$x$为最小循环节的长度,只要证明不存在$y$满足$y \lt x$且$S_{1, i-y}=S_{y+1, i}$。
|
|
|
>
|
|
|
-> 假设存在这样的$y$,那么$S_{y+1, y+x}=S_{1, x}=S_{x+1, 2x}$。令$A=S_{y+1, x}, \; B=S_{x+1, y+x}$,可以发现$A$是$S_{1, x}$的后缀、$S_{y+1, y+x}$的前缀,$B$是$S_{x+1, 2x}$的前缀、$S_{y+1, y+x}$的后缀,即$S_{1, x}=AB=BA$,根据**引理 2**,$S_{1, x}$是循环串,这与$x$是最小循环节的长度矛盾。因此这样的$y$不存在,而因为$S_{1, x}$是一个循环节,所以$S_{1, i-x}=S_{x+1, i}$,根据 KMP 的原理,$nxt_i=i-x$,即$S$的最小循环节是$S_{1, i-nxt_i}$。
|
|
|
+> 假设存在这样的$y$,那么$S_{y+1, y+x}=S_{1, x}=S_{x+1, 2x}$。令$A=S_{y+1, x}, \ B=S_{x+1, y+x}$,可以发现$A$是$S_{1, x}$的后缀、$S_{y+1, y+x}$的前缀,$B$是$S_{x+1, 2x}$的前缀、$S_{y+1, y+x}$的后缀,即$S_{1, x}=AB=BA$,根据**引理 2**,$S_{1, x}$是循环串,这与$x$是最小循环节的长度矛盾。因此这样的$y$不存在,而因为$S_{1, x}$是一个循环节,所以$S_{1, i-x}=S_{x+1, i}$,根据 KMP 的原理,$nxt_i=i-x$,即$S$的最小循环节是$S_{1, i-nxt_i}$。
|
|
|
|
|
|
由此命题得证。
|