Live2D

Solution Set - Border Theory

  我发现写 Solution Set 就不用写每道题的题意了,岂不美哉?


  首先是一些奇妙结论。

  定理 1(弱周期定理) 对于字符串 S,若 S[:p]S[:q] 都是 S 的周期,且 pq,p+q|S|,则 S[:gcd(p,q)] 也是 S 的周期。

  证明 考虑更相减损,不妨令 q>p,则只需证 S[:qp] 为周期。注意到 i[1,|S|],总有 i>pi|S|q 成立,对于前者,Si=Sip=Sip+q;对于后者,Si=Si+q=Si+qp。故 S[:qp] 为周期。 

  这个定理“弱”在 p+q 的范围,该范围可以扩大到 p+q|S|+gcd(p,q),在此略过。

 

  定理 2

  1. 字符串 S 中所有 |S|2 的 border 可排列为一个等差数列。
  2. 若字符串 S 的最长 border p|S|2,则 d=np 是周期;集合 B={q[1,p]qp(modd)} 均为 border;且 [d,p] 内的所有 border BB。(注意区间左端点。)
  3. 对于字符串 S,T,集合 {k[|S|2,min{|S|,|T|}]S[:k]=T[|S|k+1:]} 可排列为一个等差数列。

  证明

  1. |S|=n。取最大的满足条件的 border p,那么由 定理 1,对于任意满足条件的 border q,有 (np)(nq),且任意满足 q|S|2(np)(nq)q 均为 border。因此,可得一个公差为 np 的等差数列。 

  2. 这是与上一定理形似,但应用更广的扩展。显然 d 是周期且所有 qB 为 border,我们还需要说明 [d,p] 内不存在其他形式的 border。反证,若存在一个 r[d,p]B 为 border,则能取出一个 qB,使得 q,r 同属一个周期且 |qr|<d。通过说明 d=|qr|<d 也是周期,我们能找到一个大于 p 的 border,继而导出矛盾。具体讨论见下图:

    example.png

    例如 r=|GH|,q=|IJ|,d=2(网格线单位为 1),通过在 border 和周期间代换,我们发现在串 KM 中,d 是大于半串长的 border,而 d=|HM| 便是其周期。继而 d=kd,所以 d 是原串周期。接着上文的讨论,我们导出了矛盾。 

  3. 类似地,取最大的满足条件的 k=p,那么任意 k 均为 S[:p] 的 border,且 S[:p] 的 border 均满足条件。此后同理可证。 

  举一个 定理 2.(1) 的经典使用例子:确保无法均摊复杂度的 KMP(e.g. Trie 上 KMP)复杂度不超过 O(nlogn)

 

  定理 3 长度为 n 的字符串 S 的所有 border 可划分为 O(logn) 个等差数列。

  证明 令 定理 2.(3) 中的 (S,T)(S,S),(S[:|S|/2],S),(S[:|S|/4],S),,分别可证长度在 [|S|/2,|S|],[|S|/4,|S|/2], 的 border 构成等差序列。由于是复杂度上界我们也没必要考虑边界取不取, 因此得证。此外,我们还能说明,可以按从大到小或从小到大的顺序贪心构造等差数列,这种构造方法能够确保复杂度。 

  个人感觉不涉及自动机等模板化算法的字符串题都比较神奇,而 border 又算最神奇的考点,所以相关结论(esp. 定理 3)还是在脑中留个印象比较好√


  「洛谷 P5829」「模板」失配树 + 额外限制:空间 10 Mib

  不妨记 S[:i] 的最长 border 为 next(i),若没有严格空间限制,显然可以在边 (next(i),i) 构成的树上求每对 p,q 的 LCA。

  额外的限制要求我们对上文定理的灵活使用。不妨设 p>q,取当前 r=next(p),讨论

  • r<p2,可见简单地令 pr 是可以保障复杂度的;
  • rp2,注意 rS[:p] 的最大 border,由 定理 2.(2),若 qr(modpr),则答案为 q;否则令 p(rmod(pr))+(pr)。(我们无法保证 [1,pr] 内无其他形式的 border。)

  复杂度显然为 O(n+mlogn),明显于一般的求 LCA 方法(你写四毛子当我没说 w)。


  「洛谷 P1393」Mivik 的标题

  这种匹配计数题一般是用 border 来转移 DP。设 l=|S|BS 的真 border 集合。从暴力入手,令 f(i) 表示生成了前 i 个字符,恰好得到一个 S 的方案数。容斥计数,对于 il,显然有

f(i)=miljilf(j)jBf(il+j).

第一个和式可以前缀和优化,第二个和式,利用 定理 3 拆分为 O(logl) 个等差数列上的 f 之和,亦可前缀和优化。最终复杂度为 O(nlogl)


  「HNOI 2019」「洛谷 P5287」JOJO

  询问显然可以视为树形结构,相当于需要在树上 KMP。

  发现当两个子串匹配时,它们的二元组表达几乎是一致的,只有左右两端可能不同。所以我们的第一个问题是设计一个基于二元组的 next 定义。定义两个二元组串 S=(S1c,S1x)(S2c,S2x)T=(T1c,T1x)(T2c,T2x)ST,当且仅当

|S|=|T|(i>1,(Sic,Six)=(Tic,Tix))S1c=T1cS1xT1x.

其实这个 "" 选得不好,烦请注意 没有反身性。此后,对于二元组串 S,定义 next(i) 为最大的 j,满足

S[:j]S[ij+1:i].

先不考虑复杂度,这个 next 是能够通过正常 KMP 求出来的。接着思考已知 next 时如何求最后一个二元组内部的 border 贡献。显然,沿着 |S|1 一路跳 next,维护最后一个二元组已经有多长的前缀找到了 border,考虑当前跳到的位置 i 的下一个二元组 Si+1 能否使更长的前缀找到 border,若能,有多长的前缀找到 border,即可计算答案。

  现在的唯一问题是复杂度。我们去思考该定义下的 next 能否用 定理2.(1) 加速跳跃过程。答案是《能但不完全能》。举个例子

example2.png

看图,此时 S=GH 的最长 "border" 为 AB|AB||S|2ABCD,故第一个二元组 |AE||CF|。我们只知道,第一个二元组 CFS 中点左侧,它无法构成严格等于的周期。因此,我们只能断言通过周期跳跃,着陆在 |S|2 之后的某个位置是安全的。当然,这一限制可以收紧,但已经能够保证复杂度。最终复杂度即为 O(nlogn)


  「WC 2016」「洛谷 P4156」论战捆竹竿

  对于竹竿长度 x,初始有 x=n,每次操作可以令 x 加上 nb,其中 bS 的任意 border,问最终 [1,W] 内有多少可取的 x。可以发现,这是一个同余最短路模型。

  但要小心,如果我们直接开始“优化建图”,很可能忽略原本显而易见的性质。套一般性模板的代价自然是失去特殊性。所以暂时别去想“跑最短路”,只是思考如何求到在某个有意义的模数 m 下,最小的使得 xr(modm), r=0..m1x:=dm(r) 的值。

  联系已有结论,感觉等差数列在同余意义下会带来特殊性,所以想到先用 定理 3 拆出等差数列。设 x,x+d,,x+kd 均为 nborder 的值(注意不是 border 的值),把初始的 x 作为模数模掉,按照 d 在模 x 意义下划分出的 gcd(x,d) 个环,用 +d,+2d,,+kd 来更新同一个环上的 dx(r),注意到边带正权,所以初始最小的 dx(p) 不会被更新,可以使用单调队列优化。

  然而这种想法导向另一个问题:我们需要实现不同模数下 d 的转化。考虑 dx(r) 的意义:dx(r)+kx (kN) 都能取到,转化到 dy 下,即 (dx(r)mody)+k(xmody) (kN) 都能取到。那么初始有 dy(dx(r)mody)=dx(r),再用 +k(xmody)dy 之间互相转移。由于 k 没有上限,不需要单调队列。

  综上,我们虽然用同余最短路描述了问题,但仍紧贴 border 的性质完成转化。最终复杂度 O(Tnlogn)


  最重要的结论:字符串题多画图√

posted @   Rainybunny  阅读(291)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示