Border 理论

cnmd,扫盲。

要开字符串,然而 Lyndon 分解不光大毒瘤而且似乎没什么大用。因此换个方向,来记点结论。应用到时候再开一个。先把结论都记在这里,以后用的时候直接指路过来。

周期和 border

1p|s|,i[1,|s|p],s[i]=s[i+p],则 ps 的一个周期。若 p | |s| 则为整周期。

0r|s|,s[1,r]=s[|s|r+1,|s|],则 s[1,r]s 的一个 border。

容易发现结论:s[1,r] 为 border 等价于 |s|r 为周期。

Weak Periodicity Lemma

p,q 为字符串 s 周期,p+q|s|,则 gcd(p,q) 也是 s 的周期。

证明:不妨设 p<q。设 d=qp,则:

  1. ip>0s[i]=s[ip]=s[ip+q]=s[i+d]
  2. i+q|s|s[i]=s[i+q]=s[i+qp]=s[i+d]

而由 p+q|s| 得到 p|s|q,因此上面两个包含了所有的 i

还有更强的结论(Periodicity Lemma):p+qgcd(p,q)|s|gcd(p,q) 也是 |s| 周期。证明找不到。

几个奇异结论

  • 定理:若 2|s||t|,则 st 中出现位置为等差数列。

仅讨论匹配次数达到 3 的情况。

假设 st 中第一、二次匹配 s1,s2 间距为 d,另一次匹配和第二次间距为 q。那么显然 d,q 都为 s 周期。由 2|s||t|,则 |t||s||s|。又 d+q+|s||t|,得到 d+q|s|。则 r=gcd(d,q)s 周期。设 s 最小周期为 pr,显然 p|r

显然 s1s2 同样有 d 这一周期。那么显然 p 同样是它的周期。假如 d 不是最小周期,那么 s1 往右平移 p 就是第二次匹配,矛盾。因此 d 是最小周期。又因为 p=d|q,则所有匹配的循环节都是重合的,即构成等差数列。

若等差数列至少 3 项,根据上述证明可以得到公差为 s 的最小周期 p,容易得到 p|s|2

由此我们有引理:

  • 字符串 s 的所有长度不小于 |s|2 的 border 长度组成等差数列。

证明:设长度最大的为 |s|p ,另一个为 |s|q,容易得到 gcd(p,q)=p|q。那么和上一个定理相同,因此构成等差数列。

  • 一个串 s 的所有 border 按长度排序后可以分成 O(log|s|) 段,每段是个等差数列。

证明:首先把长度达到一半的 border 划一个等差数列。考虑它们之中长度最小的,长度一定小于 34|s|

一个更好的界是 log2|s|

经典例题:[WC2016]论战捆竹竿

另外的应用:单次在线 O(logn) 的基本子串字典(论文题了)和子串循环同构判定。(实现到时候再说)

回文 border

  • 定理:回文串的回文后缀(或者前缀)就是 border。

显然。因此有推论:一个字符串的所有回文后缀的长度可以表示为 O(logn) 个等差数列。

  • 定理:回文串 s 有周期 p,则一个循环节可以拆成两个回文串,且长度分别为 |p|(|s|mod|p|),|s|mod|p|

证明可以自己画图。也挺显然。

  • 定理:设 s 为回文串 t 最长回文前/后缀,若 2|s||t|,则 t 只会在 s 中匹配这两次。

不是很显然。证一下。

首先 s 的匹配一定成等差数列,公差为 s 的周期。那么 s 的周期也为 t 的周期,即可把 s 的一个循环节拆成两个回文串。假如前两次匹配分别为 s1,s2,那么 s1s2 也是回文串。那么既然 s1 是最长,那么 s1s2=t,就只有这两次了。

最小后缀

一些定义:

suf(s)s 的所有后缀。

minsuf(s)s 的最小后缀。

ssuf(s) 为在 s 后边加一个串后可能成为最小后缀的后缀。

  • 定理:对于任意两个 ssufs,t|s|<|t|st 前缀。

显然。

  • 定理:若两个 ssufs,t 满足 |s|<|t|,则 2|s|<|t|

证明不会。

posted @   gtm1514  阅读(269)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示