Border Theory 学习笔记
\(~~~~\) 膜拜 sh。
一、周期
\(~~~~\) 1.定义: 若字符串 \(s\) 某个前缀重复若干次(可以非整数,但次数 \(\times\) 该前缀长度为整数)可得到该字符串,则该前缀的长度被称作 \(s\) 的周期。
\(~~~~\) 形式化地,即对于字符串 \(s\) ,正整数 \(p\) 满足 \(s\) 可被表示为 \(pre(s,p)^x\) ,则称 \(p\) 为 \(s\) 的周期。同时定义 \(per(s)\) 为 \(s\) 的最小周期。
\(~~~~\) 2.弱周期定理
\(~~~~~~~~\) ①.内容 :若 \(p,q\) 为 \(s\) 的周期,且 \(p+q \leq |s|\) ,则 \(\gcd(p,q)\) 为 \(s\) 的周期。
\(~~~~~~~~\) ②.证明 :若 \(i\geq p\) ,由周期定义应有:\(s_i=s_{i-p}\) ;
\(~~~~~~~~~~~~~~~~~~~~~~~~\) 若 \(i+q\leq |s|\) ,由周期定义应有:\(s_i=s_{i+q}\);
\(~~~~~~~~~~~~~~~~~~~~~~~~\) 综上有:\(s_{i-p}=s_{i+q} \Rightarrow\) \(q-p\) 也是一个周期。
\(~~~~~~~~~~~~~~~~~~~~~~~~\) 注意到这就可以用更相减损来迭代下去,进而得到 \(\gcd\) 。
二、Border
\(~~~~\) 1.定义 :若字符串 \(s\) 其长为 \(p\) 的前缀与长为 \(q\) 的后缀相同,则 \(p\) 为 \(s\) 的一个border.
\(~~~~\) 形式化地,若对于字符串 \(s\),有正整数 \(p\) 满足 \(pre(s,p)=suf(s,p)\) ,则 \(p\) 为 \(s\) 的一个border。
\(~~~~\) 2.求法——KMP: 定义 \(nxt_i\) 表示字符串 \(s\) 的长为 \(i\) 的前缀的 border,注意到这其实类似于串与自己作匹配,所以我们暴力匹配,当匹配不上时利用已求得的 \(nxt\) 减少需要重新匹配的即可。
三、失配树
\(~~~~\) 我也不太知道这东西有什么其他用处。
\(~~~~\) 1.例题: 给定一个字符串,\(q\) 组询问,每次询问该字符串长为 \(x\) 的前缀和长为 \(y\) 的前缀的最长公共border.
\(~~~~\) 注意到某个前缀的 border 的 border 还是这个前缀的 border ,那么我们就可以不停地跳 border,并且注意到这个过程类似于跳树上LCA,所以直接倍增处理即可。
四、Border Theory
\(~~~~\) 1. Lemma: 字符串 \(s\) 的所有不小于 \(\frac{|s|}{2}\) 的 border 构成等差数列。
\(~~~~\) 证明: 记:\(s\) 最大的 border 为 \(n-p\) ,另有一个 border 为 \(n-q\) ,(\(p,q\leq \frac{|s|}{2}\)),则 \(p,q\) 为 \(s\) 的两个周期,由弱周期定理可知:\(\gcd(p,q)\) 也是周期,故 \(n-\gcd(p,q)\) 也是 border 。又因为 \(\gcd(p,q)\leq p\) ,且 \(n-p\) 为最大的 border,即 \(p\) 为最小的周期,故 \(\gcd(p,q)=p\) ,故 \(p|q\) 。故字符串 \(s\) 所有不小于 \(\frac{|s|}{2}\) 的构成等差数列,且公差为 \(p\) 。
\(~~~~\) 2. 推论: 字符串 \(s\) 的所有 border 按长度排序后可被划为 \(\log |s|\) 段等差数列。
\(~~~~\) 证明: 暂且利用上面的引理,每次减去一半感性证明,具体待填坑。