[学习笔记]Border&Period杂谈

  十分简要地胡乱说一些与 Border 相关的东西。

Border 是什么?

  用 kmp 求的那个东西就是 border,因此 border 可以在 O(n) 内用 kmp 求出来,每个前缀的 border 构成树形结构,把这个树建出来,我们称其为失配树。

Border 的性质

弱周期引理(Weak Periodicity Lemma,WPL)

  若 p,qS 的周期,且 p+q|S|,那么 gcd(p,q) 也是 S 的周期。

  证明:不妨设 p<q,令 d=qp,那么:

  • i<q 时,S[i]=S[i+q]=S[i+qp]=S[i+d]
  • i>p 时,S[i]=S[ip]=S[ip+q]=S[i+d]

  不难发现 i 取遍 [1,|S|],因此 d 也为 S 的周期,根据辗转相除法,可证 gcd(p,d)S 的周期。

周期定理(Periodicity Lemma,PL)

  若 p,qS 的周期,且 p+qgcd(p,q)|S|,那么 gcd(p,q) 也是 S 的周期。

  它比 WPL 稍微强一点在于对 p,q 的限制。用得少,不证它了。

前缀整除周期传递性

  若 ST 的前缀,且 T 有周期 aS 有周期 bba|S|a,则 T 也有周期 b.

  证明:画个图就行。

长串等差匹配位

  若 2|S||T|,则 ST 中的匹配位置必为等差序列.

  证明:先将 T 中没有被 S 覆盖的部分去掉,由于 2|S||T|,因此此时的 T 的所有部分都被 S 覆盖。

  对于 ST 中的匹配位小于等于 2,结论是显然的,下面考虑匹配位大于 2 的情况。

  设 ST 中第一二次的匹配位差为 d,第二次与后面的某一次匹配位差为 q,不难发现 d,q 均为 S 的周期,并且显然有 d+q+|S||T|,并且 2|S||T|,可得 d+q|S|,由 WPL 得 r=gcd(d,q)S 的周期。设 pS 的最小周期,那么有 pr,否则 可以使用 WPL 构造更小的周期。此时 prd.

  若 p<d,那么,由于 pS 的循环,因此我们可以找到一个距离第一匹配位距离比 d 更小的第二匹配位,与 d 的定义矛盾。

  因此只有可能是 p=r=d,又因为 r=gcd(d,q)=d,因此 dq,所以匹配位在处理之后的 T 上,从位置 1 开始,每 d 个出现一次。还原到原来的 T 串上,匹配位就是公差为 d 的等差数列了。

长 border 等差匹配位

  S 的长度达到 n2 的 border 的长度构成等差序列。

  设 np,nqS 的两个长度达到 n2 的 border,且 np 是最大的 border,那么 pS 的最小周期,且 p,q 均为 S 的周期,由于 np>nqn2,因此 p+qn,因此 r=gcd(p,q) 也为 S 的周期,由于 pS 的最小周期,因此 r=p,即 pq,且 p 是最小周期,因此所有的 border 长度以 p 为公差构成等差序列。

  不难发现,实际上 nkp 都是 S 的 border,因为既然 p 为周期,那么 2p,3p, 均为周期,进而说明 n2p,n3p, 均为 border.

长 border 大一统

  设 npS 的最大 border,如果 npn2,那么所有 S 的长度在 [p,np] 的 border 都是 nkp 的形式,并且不存在其他形式。

  采用反证法,设 nr 也是长度在 [p,np] 的 border,且不是 nkp 的形式。由于 p 也是周期,因此我们显然可以将这个 r 进行 ±p 来任意调整。

  假设 r[kp,(k+1)p),显然我们可以找到一个 q[kp,(k+1)p)pq,此时,如果 r+qn,那么我们就可以使用 WPL 证明 d=gcd(r,q)|rq|<p 为周期进而推出矛盾了。

  如何达到 r+qn 呢?注意前面,我们可以将 r 进行调整,显然可以将 rpn2 取模,此时保证了 r<n2,此时 r+qn 了。

  当然也可以用前面的等差匹配位来证明,显然可以找到一个 t 使得 nr+tpn2,且 nr+tp 也为 border,由等差匹配位,nr+tp 应与其他 nkq 构成等差序列,此时公差会变小,与 p 的假设构成矛盾。

等差数列对数级

  一个串 S 的所有 border 按长度排序后,可以被划分成 O(logn) 个等差序列。

  把达到 n2 的 border 取出来,就是一个等差序列。然后只需要考虑长度为 n2 的前缀 S,对于 S,将达到 n4 的 border 取出来,又是一个等差序列......因此,只会有 O(logn) 个等差序列。

posted @   Arextre  阅读(217)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示