后缀、Border的研究-学习笔记
by jcvb
性质
字符串 u, v 满足 2|u| ≥ |v|, 则 u 在 v 中的所有匹配位置组成一个等差数列。
字符串 s 的所有不小于 |s|/2 的 border 长度组成一个等差数列
证明: 设 s 的最大 border 长度为 n − p, (p ≤ |s|/2), 另外某个border 的长度为 n − q, (q ≤ |s|/2), 则 gcd(p, q) 是 s 的周期, 即n − gcd(p, q) 是 s 的 border 长度, 于是 gcd(p, q) ≥ p ⇒ p | q。
自己悟出来的:
如果串s的border
应用
子串所有border(等差数列表示)
若 |u| = |v|, 记 PS(u, v) = {k : pre(u, k) = suf(v, k)}
记 LargePS(u, v) = {k ∈ PS(u, v) : k ≥ |u|/2}
我们按border的长度分类为
长度为2的整次幂的子串的出现位置(字典序排名)正好是后缀排序的过程!我们记录下来即可。
空间
可以优化到每次询问
如果
子串最大border
[BJWC2018]Border 的四种求法
子串最小后缀
法一:
设
则答案为p的最小border
法二:
记
其中
原因是有border的串的最小border一定
于是可以预处理后
子串最大后缀
求一个 p, 使得maxsuf(l, r) = max {s[p..r], maxsuf(r − m + 1, r)} 成立。
设 maxsuf(l, r) = s[x...r]。只需考虑 l ≤ x < r − m + 1 的情形,即需要求出 x。
证明:
为什么
最后,显然真正的最长公共后缀一定是周期q不断往前延伸,否则反证法可以得到矛盾。