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


  首先是一些奇妙结论。

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

  证明 考虑更相减损,不妨令 \(q>p\),则只需证 \(S[:q-p]\) 为周期。注意到 \(\forall i\in[1,|S|]\),总有 \(i>p\lor i\le|S|-q\) 成立,对于前者,\(S_i=S_{i-p}=S_{i-p+q}\);对于后者,\(S_i=S_{i+q}=S_{i+q-p}\)。故 \(S[:q-p]\) 为周期。 \(\square\)

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

  定理 2

  1. 字符串 \(S\) 中所有 \(\ge\frac{|S|}{2}\) 的 border 可排列为一个等差数列。
  2. 若字符串 \(S\) 的最长 border \(p\ge\frac{|S|}{2}\),则 \(d=n-p\) 是周期;集合 \(B=\{q\in[1,p]\mid q\equiv p\pmod d\}\) 均为 border;且 \([d,p]\) 内的所有 border \(B'\subseteq B\)。(注意区间左端点。)
  3. 对于字符串 \(S,T\),集合 \(\left\{k\in\left[\frac{|S|}{2},\min\{|S|,|T|\}\right]\mid S[:k]=T[|S|-k+1:]\right\}\) 可排列为一个等差数列。

  证明

  1. 记 \(|S|=n\)。取最大的满足条件的 border \(p\),那么由 定理 1,对于任意满足条件的 border \(q\),有 \((n-p)\mid(n-q)\),且任意满足 \(q\ge\frac{|S|}{2}\land(n-p)\mid(n-q)\) 的 \(q\) 均为 border。因此,可得一个公差为 \(n-p\) 的等差数列。 \(\square\)

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

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

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

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

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

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

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


  「洛谷 P5829」「模板」失配树 + 额外限制:空间 \(\le 10\text{ Mib}\)。

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

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

  • \(r<\frac{p}{2}\),可见简单地令 \(p\leftarrow r\) 是可以保障复杂度的;
  • \(r\ge\frac{p}{2}\),注意 \(r\) 是 \(S[:p]\) 的最大 border,由 定理 2.(2),若 \(q\equiv r\pmod{p-r}\),则答案为 \(q\);否则令 \(p\leftarrow (r\bmod (p-r))+(p-r)\)。(我们无法保证 \([1,p-r]\) 内无其他形式的 border。)

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


  「洛谷 P1393」Mivik 的标题

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

\[f(i)=m^{i-l}-\sum_{j\le i-l}f(j)-\sum_{j\in B}f(i-l+j).
\]

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


  「HNOI 2019」「洛谷 P5287」JOJO

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

  发现当两个子串匹配时,它们的二元组表达几乎是一致的,只有左右两端可能不同。所以我们的第一个问题是设计一个基于二元组的 \(\operatorname{next}\) 定义。定义两个二元组串 \(S=(S_1^c,S_1^x)(S_2^c,S_2^x)\cdots\) 和 \(T=(T_1^c,T_1^x)(T_2^c,T_2^x)\cdots\) 有 \(S\approx T\),当且仅当

\[|S|=|T|\land (\forall i>1,(S_i^c,S_i^x)=(T_i^c,T_i^x))\land S_1^c=T_1^c\land S_1^x\le T_1^x.
\]

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

\[S[:j]\approx S[i-j+1:i].
\]

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

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

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


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

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

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

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

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

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


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

Solution Set - Border Theory的更多相关文章

  1. Border Theory

    持续更新中!!!更个屁,无线停更! 前言: KMP 学傻了,看 skyh 说啥 border 树,跑来学 border 理论 洛谷云剪切板:https://www.luogu.com.cn/paste ...

  2. How do I learn mathematics for machine learning?

    https://www.quora.com/How-do-I-learn-mathematics-for-machine-learning   How do I learn mathematics f ...

  3. HTML5 Differences from HTML4

    Abstract "HTML5 Differences from HTML4" describes the differences of the HTML5 specificati ...

  4. 模板库 ~ Template library

    TOC 建议使用 Ctrl+F 搜索 . 目录 小工具 / C++ Tricks NOI Linux 1.0 快速读入 / 快速输出 简易小工具 无序映射器 简易调试器 文件 IO 位运算 Smart ...

  5. [Mathematics][MIT 18.03] Proof of a Theory about the Solution to Second-order Linear Homogeneous Differential Equation

    At first, I'd like to say thank you to MIT open courses which give me the privilege to enjoy the mos ...

  6. Solution -「Gym 102956F」Border Similarity Undertaking

    \(\mathcal{Description}\)   Link.   给定一张 \(n\times m\) 的表格,每个格子上写有一个小写字母.求其中长宽至少为 \(2\),且边界格子上字母相同的矩 ...

  7. MySQL高可用解决方案(MySQL HA Solution)

    http://blog.sina.com.cn/s/blog_7e89c3f501012vtr.html 什么是高可用性?很多公司的服务都是24小时*365天不间断的.比如Call Center.这就 ...

  8. HDU 5351 MZL's Border (规律,大数)

    [HDU 5351 MZL's Border]题意 定义字符串$f_1=b,f_2=a,f_i=f_{i-1}f_{i-2}$. 对$f_n$的长度为$m$的前缀$s$, 求最大的$k$满足$s[1] ...

  9. hdu5351 MZL's Border(规律题,java)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud MZL's Border Time Limit: 2000/1000 MS (Ja ...

随机推荐

  1. 谈谈 StringBuffer 和 StringBuilder 的历史故事

    1.前言 众所周知,StringBuffer 是线程安全的 ,而StringBuilder 不是线程安全的  ,但是 StringBuilder 速度会更快. 事实上 作为一个字符串拼接 方法 ,在线 ...

  2. react中使用immutable

    官方文档(https://immutable-js.github.io/immutable-js/docs/#/) 有人说 Immutable 可以给 React 应用带来数十倍的提升,也有人说 Im ...

  3. vue实现引用less,sass全局变量

    1.npm install sass-resources-loader --save-dev: 2.build/utils.js中,修改 function resolveResource(name) ...

  4. 兼容h5在ios上登录窗口input失焦后页面不会滚

    $("#logincode").blur(function(){ //滚动到顶部 window.scrollTo(0, 0); })一般多用于密码框失焦后,页面不回滚

  5. 【Java】流程控制

    文章目录 流程控制 一.用户交互scanner 1.1 Scanner对象 1.2 Scanner进阶使用 二.顺序结构 三.选择结构 3.1 if单选择结构 3.2 if双选择结构 3.3 if多选 ...

  6. Android官方文档翻译 九 2.2Adding Action Buttons

    Adding Action Buttons 增加动作按钮 This lesson teaches you to 这节课教给你 Specify the Actions in XML 在XML中指定动作 ...

  7. HTTP API认证授权方案

    目录 一.需求背景 二.常用的API认证技术 2.1 App Secret Key + HMAC 2.2 OAuth 2.0 2.2.1 Authorization Code Flow 2.2.2 C ...

  8. Java构造器(构造方法)

    类中的构造器也成为构造方法,是在进行创建对象的时候必须调用的,并且构造器有以下两个特点: 1.必须和类名字相同 2.必须没有返回类型也不能写void public class Demo06 { //一 ...

  9. Windows系统安装和office版本兼容

    MSDN, I tell you 下载windows10系统各种纯净镜像.但是还是推荐使用官网修改参数显示出下载链接,下载windows10最新版. 在最近几次重做系统中,PE工具似乎无法识别从MSD ...

  10. java继承成员函数特点

    1 //成员函数. 2 /* 3 * 当子父类中出现成员函数一模一样的情况,会运行子类的函数. 4 * 这种现象,称为覆盖操作.这时函数在子父类中的特性. 5 * 函数两个特征: 6 * 1,重载. ...