Border Theory 学习笔记
Border Theory
border 定义:在同一个串中既是前缀又是后缀。
最长border:最长的 border
性质1:
一个串 border 的 border 还是它的 border。画图自己推,很简单的。
border 求法 :
首先,border 的左端点显然会随着 i 向右枚举,向左移动。
看下一个字符是否能匹配,匹配不上就跳 border 的 border。
nxt[1] = 0; // nxt 是 最长border对应前缀长度
for(int i = 2, j = 0; i <= n; ++ i) {
    while(j && s[j + 1] != s[i]) j = nxt[j]; 
    if(s[j + 1] == s[i]) ++ j;
    nxt[i] = j;
}
KMP 的字符串匹配也差不多就是这么搞的。
失配树
把一个串对应的点连向其最长 border 对应的前缀节点,构成的树。按着根链跳就可以找到所有 border。
作用1:可以找到两个串的公共 border。(用 LCA 求)
定义周期 :如果 \(\forall i\le |s|-T,s_i=s_{i+T}\),则称 \(T\) 为 \(s\) 的周期。
性质1:
如果 b 是 s 的一个 border,则 \(p = |s| - |b|\) 是 s 的一个周期。
证明显然。。。
性质2:
如果 p 和 q 是 s 的周期,且 \(p + q \le |s|\) ,那么 \(\gcd(p,q)\) 也是 s 的周期。
证明:画出图后很好感性理解。
令 \(p > q\)
当 \(i \le q\),\(s_i = s_{i+p} = s_{i+p - q}\)
当 $i < |s| - p + q $ && $ i > q\(,\)s_i = s_{i - q} = s_{i-q+p}$。
根据辗转相减可得此结论。
推论:若 \(p,q\) 均为 \(s\) 的周期,且 \(p+q-gcd(p,q)\leq|s|\),则 \(gcd(p,q)\) 也是 \(s\) 的周期。
证明不会 qwq
定理1:
s 所有长度大于 \(\lfloor\frac{|s|}2\rfloor\) 的 border 与 |s| 构成等差数列。
设最长 border 长为 b,故一定有周期 \(p = |S| - b\) ,故一定有周期 \(2*p,3*p...k*p,k\in N\) 。故存在一些 border 长度为等差数列。
假设还有一个 border 长度大于 \(|s| / 2\) 并且不是等差数列,设其对应的周期为 q,那么 \(\gcd(p,q)\) 也是周期,那么 \(s - gcd\) 也是 border,然后就矛盾了。GG
推论:
s 所有 border 可以分类分成至多 log 个等差数列。
长度大于 s / 2 的是一类,然后长度在 (s / 4,s / 2) 在一类,这类 border 可以当作是这个区间里最长的 border 的 border 。。。所以有最多 log 类。
做题
[NOI2014] 动物园
对于所有前缀 s ,求长度小于 \(s / 2\) 的最长 border。
就是找到最后一个长度大于 \(s / 2\) 的那个border 后再跳一次最长 border。
根据定理1 : s 所有长度大于 \(\lfloor\frac{|s|}2\rfloor\) 的 border 与 |s| 构成等差数列,就可以很轻松的找到 最后一个长度大于 \(s / 2\) 的那个border 。
核心代码:int p = i - nxt[i], k = nxt[i - ((i - 1) / 2) / p * p];
P1393 Mivik 的标题
随机生成一个串,每个字符是 [1, m] ,求出现目标串的概率。
转计数题,求出现目标串方案数。
设 \(f_i\) 表示在第 i 个位置第一次匹配上目标串的方案数。
考虑转移,钦定 i 位置匹配了 s ,前面后面都随便选,减掉在前面匹配上的。
匹配在 [s,i - s] 的位置 : \(\sum f_j m^{i - s - j + 1}\) ,这个用秦九昭跑一跑就行了。很好搞。
匹配在 [i - s+ 1, s-1] 的位置,观察发现肯定只有 s 的 border 才匹配的上, s 的 border 可以分为 log 个等差数列,对于每个等差数列:\(\sum_k f_{i-kp}\),这个可以对每一个 p 维护这个世子的前缀和之类的,就行了。

                
            
        
浙公网安备 33010602011771号