Border Theory | 基本子串字典
*本文为学习笔记。
- Weak Perioud Lemma:
p_1 ,p_2 是s 的周期,且p_1+p_2\leq|s| ,则\gcd(p_1,p_2) 是s 的周期
证明:辗转相减法。若
p_1 ,p_2 是s 的周期,不妨设p_1\le p_2 ,则对于1\leq i\leq p_1 ,i+p_2\leq|s| ,故s_i=s_{i+p_2}=s_{i+p_2-p_1} ,s 的后半段也有相似结论,所以p_2-p_1 是s 的周期。
-
若
2|u|\geq|w| ,则u 在w 中出现的所有左端点构成等差序列。 -
更强地,当
u 在w 中出现至少三次,则公差为u 的最小周期per(u) 。
证明:对于
u 左端点于位置i 在w 中出现,不妨设i+p_1 、i+p_1+p_2 也作为左端点在w 中出现(p_1,p_2\geq 1 ),由于2|u|\geq|w| ,所以三次出现的u 必定有重合,所以\gcd(p_1,p_2) 是u 的周期,i+kp_0 也是u 在w 中出现的位置,所以p_1=p_2=p_0 。
所以如果两个串长度相差不大,会有很多非常好性质。
所以我们在处理 Border 问题时,可以使用 ST 表的思想,考察长度为
引入基本子串字典:记
考虑如何处理区间 Border 问题,P4482 [BJWC2018] Border 的四种求法。
首先倍增分段,只考虑长度在
考虑一个长度在
我们可以用等差数列的引理,这个引理告诉我们,
两个等差数列求交当然也是等差数列,实际上我们得到了 Border 的另一条性质:长度在
如何对两个等差数列求交,不是非常容易,但我们试图证明,如果两个等差数列项数不小于
证明:不妨设
u_0 的最小周期小于v_0 的最小周期,考虑u_0 在后缀中的匹配,u_0 在其中出现三次,则三次的偏移为u_0 的最小周期per(u_0) 。考虑v_0 这一段中现在有了两个周期,per(u_0) 以及v_0 本身的周期per(v_0) ,又我们设per(u_0)\leq per(v_0) ,所以使用 Weak Perioud Lemma,\gcd(per(u_0),per(v_0)) 也为周期,所以只能per(u_0)=per(v_0) 。
现在问题转化为了求这个等差序列。
由于长度都是
确定最小值、次小值、最大值就可以得到一个等差数列。字典已经排序,可以二分求解,但是会多个
考虑以
所以我们就可以单
【code】
咕咕咕(不敢写?)
- Perioud Lemma:
p_1 ,p_2 是s 的周期,且p_1+p_2\leq|s|+\gcd(p_1,p_2) ,则\gcd(p_1,p_2) 是s 的周期
比 Weak 难证多了。
证明:不妨设
p_1\geq p_2 ,设g=\gcd(p_1,p_2) ,总长度为l 。考虑长度为
l-p_2 的前缀,可以用 Weak Perioud Lemma 相似的证明方法证出此段内w_i=w_{i+p_1-p_2} 。使用数学归纳法:长度为
l-p_2 的前缀,有两个周期分别为p_2 与p_1-p_2 ,满足关系:p_2+(p_1-p_2)-g\leq l-p_2 ,是由p_1+p_2\leq l+g 简单推导得到的。仍然满足命题条件,可以归纳,所以g 是这个前缀的周期。同理也可以得到
g 是相同后缀的周期。两段可以拼起来的条件为前缀和后缀相交,即需要证明
p_2\leq l/2 。因为l\geq p_1+p_2-g\geq p_1+p_2-(p_1-p_2)=2p_2 ,所以得证。
问题:查询子串的最小后缀。
显然能用 SAM 做,但如果要求
把子串的后缀拓展成原串的后缀,求出沿伸到原串末尾的最小后缀,这个是可以用 ST 表的思想
这个有用吗,有点。如图,绿色部分为我们要求的答案,又因为红色为整个串在这个区间里的的最小后缀,所以绿色的串一定与红色的串长度为绿色串长度的前缀一样,否则红色就是更优的。
所以绿色串是红色串的 Border。而这个 Border 自然是越小越好,因为 Border 都是红色的前缀,越小的前缀排名越靠前。
形式化地,设
这个如何求?我们不直接求。
我们有结论,一个串的最小 Border 一定不到长度的一半(因为由于
我们做一件非常聪明的东西,将区间按
仿照 ST 表,令
和 ST 表一模一样,预处理所有长度为
所以就可以实现
【code】
咕咕咕。