Border Theory 学习笔记

Border Theory 学习笔记

     膜拜 sh。

一、周期

     1.定义: 若字符串 s 某个前缀重复若干次(可以非整数,但次数 × 该前缀长度为整数)可得到该字符串,则该前缀的长度被称作 s 的周期。

     形式化地,即对于字符串 s ,正整数 p 满足 s 可被表示为 pre(s,p)x ,则称 ps 的周期。同时定义 per(s)s 的最小周期。

     2.弱周期定理

         ①.内容 :若 p,qs 的周期,且 p+q|s| ,则 gcd(p,q)s 的周期。

         ②.证明 :若 ip ,由周期定义应有:si=sip

                        i+q|s| ,由周期定义应有:si=si+q

                         综上有:sip=si+q qp 也是一个周期。

                         注意到这就可以用更相减损来迭代下去,进而得到 gcd

二、Border

     1.定义 :若字符串 s 其长为 p 的前缀与长为 q 的后缀相同,则 ps 的一个border.

     形式化地,若对于字符串 s,有正整数 p 满足 pre(s,p)=suf(s,p) ,则 ps 的一个border。

     2.求法——KMP: 定义 nxti 表示字符串 s 的长为 i 的前缀的 border,注意到这其实类似于串与自己作匹配,所以我们暴力匹配,当匹配不上时利用已求得的 nxt 减少需要重新匹配的即可。

三、失配树

     我也不太知道这东西有什么其他用处。

     1.例题: 给定一个字符串,q 组询问,每次询问该字符串长为 x 的前缀和长为 y 的前缀的最长公共border.

     注意到某个前缀的 border 的 border 还是这个前缀的 border ,那么我们就可以不停地跳 border,并且注意到这个过程类似于跳树上LCA,所以直接倍增处理即可。

四、Border Theory

     1. Lemma: 字符串 s 的所有不小于 |s|2 的 border 构成等差数列。

     证明: 记:s 最大的 border 为 np ,另有一个 border 为 nq ,(p,q|s|2),则 p,qs 的两个周期,由弱周期定理可知:gcd(p,q) 也是周期,故 ngcd(p,q) 也是 border 。又因为 gcd(p,q)p ,且 np 为最大的 border,即 p 为最小的周期,故 gcd(p,q)=p ,故 p|q 。故字符串 s 所有不小于 |s|2 的构成等差数列,且公差为 p

     2. 推论: 字符串 s 的所有 border 按长度排序后可被划为 log|s| 段等差数列。

     证明: 暂且利用上面的引理,每次减去一半感性证明,具体待填坑。

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