Border 理论

cnmd,扫盲。

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

周期和 border

\(1\le p\le |s|,\forall i\in[1,|s|-p],s[i]=s[i+p]\),则 \(p\)\(s\) 的一个周期。若 \(p\ |\ |s|\) 则为整周期。

\(0\le r\le |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\le |s|\),则 \(\gcd(p,q)\) 也是 \(s\) 的周期。

证明:不妨设 \(p<q\)。设 \(d=q-p\),则:

  1. \(i-p>0\)\(s[i]=s[i-p]=s[i-p+q]=s[i+d]\)
  2. \(i+q\le|s|\)\(s[i]=s[i+q]=s[i+q-p]=s[i+d]\)

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

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

几个奇异结论

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

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

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

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

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

由此我们有引理:

  • 字符串 \(s\) 的所有长度不小于 \(\dfrac{|s|}2\) 的 border 长度组成等差数列。

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

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

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

一个更好的界是 \(\lceil\log_2|s|\rceil\)

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

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

回文 border

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

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

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

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

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

不是很显然。证一下。

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

最小后缀

一些定义:

\(\text{suf}(s)\)\(s\) 的所有后缀。

\(\text{minsuf}(s)\)\(s\) 的最小后缀。

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

  • 定理:对于任意两个 \(\text{ssuf} s,t\)\(|s|<|t|\)\(s\)\(t\) 前缀。

显然。

  • 定理:若两个 \(\text{ssuf} s,t\) 满足 \(|s|<|t|\),则 \(2|s|<|t|\)

证明不会。

posted @ 2023-02-23 21:41  gtm1514  阅读(245)  评论(0编辑  收藏  举报