border与period学习笔记

border与period学习笔记

起因是觉得自己对border这一套理论完全不会,来学一手

符号定义

以下默认 ss​ 为一个字符串

s[i]s[i] 表示字符串 ss 下标为 ii 的字符

s[i,j]s[i,j] 表示字符串 ss 下标位于 [i,j][i,j] 的子串

pre(s,x)pre(s,x)​ 表示字符串 ss​ 长度为 xx 的前缀​

suf(s,x)suf(s,x) 表示字符串 ss 长度为 xx 的后缀​

定义

0r<s,pre(s,r)=suf(s,r)0\leq r<|s|,pre(s,r)=suf(s,r),则称 rrss 的一个 border\text{border}​​

0<ps,s[i]=s[i+p],i[1,sp]0<p\leq |s|,s[i]=s[i+p],\forall i\in[1,|s|-p]​,则称 pp​ 为 ss​ 的一个 period\text{period}​​​(周期)

记最小周期为 per(s)per(s)

显然,rrborder\text{border}     \iff sr|s|-rperiod\text{period}

引理

Weak Periodicity Lemma\text{Weak Periodicity Lemma}

ppqq​ 是 ss 的周期,p+qsp+q\leq |s|,则 gcd(p,q)\gcd(p,q) 也为 ss 的周期

证明

不妨设 p<qp<q,记 d=qpd=q-p

由于 p+qsp+q\leq |s|​,对于 i[1,sd]\forall i\in[1,|s|-d]​,i-p\geq 1\or i+q\leq |s| 一定成立

若前者成立,si=sip=sip+q=si+ds_i=s_{i-p}=s_{i-p+q}=s_{i+d}

若后者成立,si=si+q=si+qp=si+ds_i=s_{i+q}=s_{i+q-p}=s_{i+d}

ddss 的周期

不难发现这能形成一个辗转相减的过程,最终能得到 gcd(p,q)\gcd(p,q)ss 的周期

Periodicity Lemma\text{Periodicity Lemma}

pp​​ 和 qq​​ 是 ss​​ 的周期,p+qgcd(p,q)sp+q-\gcd(p,q)\leq |s|​​,则 gcd(p,q)\gcd(p,q)​​ 也为 ss​​ 的周期

字符串匹配

众所周知,字符串匹配问题由KMP算法解决

引理:若字符串 s,ts,t 满足 sv2|s|\geq \dfrac{|v|}{2}​,则​ sstt 中所有匹配位置构成一个等差数列,公差为 per(s)per(s)

证明

我们仅考虑匹配次数大于2的情况,否则显然为等差数列

由于 2sv2|s|\geq |v|,所以任意两次匹配间必有交点,任意两次匹配位置之差为 ss 的一个 period\text{period}

考虑取出第一二次匹配 u1,u2u_1,u_2,与某次匹配 uxu_x

u1u_1u2u_2 匹配位置之差为 ddu2u_2uxu_x 的位置差为 qq

易得 d,qd,qssperiod\text{period},由 Weak Periodicity Lemma\text{Weak Periodicity Lemma},可知 g=gcd(d,q)g=\gcd(d,q) 也为一个周期

ss 的最小周期 pgqu1u2p\leq g\leq q\leq |u_1\cap u_2|,故 ppu1u2u_1\cap u_2 的周期,可得 ppu1u2u_1\cup u_2 的周期

p<dp<du2u_2 左移 pp 产生匹配,故 pdp\geq d,又 pg=gcd(d,q)dp\leq g=\gcd(d,q)\leq d,所以 p=dp=d

dqd|q,故结论成立,公差为 per(s)per(s)​(含3次匹配以上)

border\text{border}​ 的结构

引理:字符串 ss 所有不小于 s2\dfrac{|s|}{2}border\text{border} 构成一个等差数列

证明

ss 最大的 border\text{border}np,(ps2)n-p,(p\leq \dfrac{|s|}{2}),另外某个 border\text{border}​ 为 nq,(qs2)n-q,(q\leq \dfrac{|s|}{2})

由于 p,qp,q​ 为 period\text{period}​,由于 Weak Periodicity Lemma\text{Weak Periodicity Lemma}​​ 引理,gcd(p,q)\gcd(p,q)period\text{period}

ngcd(p,q)n-\gcd(p,q)ss 的一个 border\text{border},又 gcd(p,q)p\gcd(p,q)\leq p,且 npn-p 为最大的 border\text{border}

gcd(p,q)=p\gcd(p,q)=p,所以 pqp|q

故字符串 ss 所有不小于 s2\dfrac{|s|}{2}border\text{border} 构成一个等差数列,公差为 pp(最小 period\text{period}

推论:字符串 ss 的所有 border\text{border} 长度排序后可分成 O(logs)O(\log|s|) 段, 每段是一个等差数列。

ssborder\text{border} 按长度 xx 分成 logs\log|s| 类,记 2k2^k 为最大不超过 nn22 的次幂

x[1,2),[2,4),,[2k1,2k),[2k,n)x\in[1,2),[2,4),\dots,[2^{k-1},2^k),[2^k,n)

对于 x[2k,n)x\in[2^k,n),显然 2kn22^k\geq\dfrac{n}{2},根据引理该段构成一个等差数列

对于 x[2i1,2i)x\in[2^{i-1},2^i)​,考虑证明其也是一个等差数列

对于长度相等的两个字符串 u,vu,v,记 PS(u,v)={kpre(u,k)=suf(v,k)}PS(u,v)=\{k|pre(u,k)=suf(v,k)\}

LargePS(u,v)={kPS(u,v)ku2}LargePS(u,v)=\{k\in PS(u,v)|k\geq\dfrac{|u|}{2}\}

那么 x[2i1,2i)x\in[2^{i-1},2^i)​ 的 border\text{border} 集合为 LargePS(pre(s,2i),suf(s,2i))LargePS(pre(s,2^i),suf(s,2^i))

类似引理的证明,容易得到 LargePS(u,v)LargePS(u,v) 构成一个等差数列

故结论得证

子串周期查询

给定字符串 s[1,n]s[1,n]​​,每次询问子串 t=s[l,r]t=s[l,r]​ 的所有周期,用 O(logn)O(\log n)​ 个等差数列表示

求出所有 border\text{border} 即可

border\text{border}​ 的结构划分

  1. border\text{border} x[2i1,2i)x\in[2^{i-1},2^i)

    uLargePS(pre(t,2i),suf(t,2i))u\in LargePS(pre(t,2^i),suf(t,2^i))​​,则 pre(t,2i1)pre(t,2^{i-1}) 为其前缀,suf(t,2i1)suf(t,2^{i-1}) 为其后缀

    我们仅需求出 pre(t,2i1)pre(t,2^{i-1})suf(t,2i)suf(t,2^i) 中匹配的开头位置集合与 suf(t,2i1)suf(t,2^{i-1})pre(t,2i)pre(t,2^i)​ 中匹配的结尾位置集合翻转后取交

    由于前面字符串匹配的结论,我们所求的匹配位置成一个等差数列

    考虑仅需求出第一二次和最后一次的匹配位置,我们就能算出等差数列的首项、公差和末项

    实现 succ(v,i),pred(v,i)succ(v,i),pred(v,i) 表示 vvii 开始向前后的第一次匹配位置即可

    由于 vv 的长度为 22 的次幂,考虑同后缀数组一半倍增,每次将数组记录下来,空间 O(nlogn)O(n\log n)

    succ/predsucc/pred​ 时二分即可得

    值得一提的是,上面求 succ/predsucc/pred 的算法被称为 Internal Pattern Matching\text{Internal Pattern Matching}

    如何对等差数列取交?

    存在引理证明若所求两个等差数列长度都不少于3,则他们的公差相等,容易 O(1)O(1) 求交

    否则枚举小长度即可,复杂度 O(1)O(1)

  2. border\text{border} x[2k,t)x\in[2^k,|t|)

    考虑将情况1的 2i2^i 改为 t|t|,仍然成立

目前为止,我们已经得到了时间 O(nlogn)O(log2n)O(n\log n)-O(\log^2 n),空间 O(nlogn)O(n\log n) 的做法

O(nlogn)O(log2n)O(n\log n)-O(\log^2 n)​ 的做法暂时不大会(

[BJWC2018]Border 的四种求法