我发现写 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. Spring循环依赖原理

    Spring循环依赖的原理解析 1.什么是循环依赖? ​ 我们使用Spring的时候,在一个对象中注入另一个对象,但是另外的一个对象中也包含该对象.如图: 在Student中包含了teacher的一个 ...

  2. Lucene8.5.x全文检索工具

    本文的资源展示: hotword:是热词的文本,比如不是词语的中文,但是是什么人名或者公司名称的词语,需要分词成一个词语的将需要的加入hotword.dic stopword:无意义的词放入的词典,或 ...

  3. 如何使用Github搭建自己的博客

    1.前期准备 sudo apt-get install npm sudo npm install hexo -g 首先使用如下命令创建项目,name是你要创建的博客的名字: hexo init {na ...

  4. [开发笔记usbTOcan]用树莓派搭建私有Git服务器

    0 | 思路 在开始编程前,先创建一个版本管理库,以前一直用SVN,但目前用Git的还是比较,正好利用这个机会学习GIt. 想过使用Github提供的免费服务器,但项目目前还没有做开源的准备,于是就有 ...

  5. IO_FILE——FSOP、house of orange

    FSOP 是 File Stream Oriented  Programming 的缩写.所有的 _IO_FILE 结构会由 _chain 字段连接形成一个链表,由 _IO_list_all 来维护. ...

  6. 【记录一个问题】铁威马nas,噪音太大了,我老婆说在客厅放了一个电饭锅

    1.硬盘转动的噪音特别大,而且还是有很大IO的长时间猛转: 2.IO的管理算法,以及做IO的进程,都有很大问题.并未做任何操作,动不动就疯了一样硬盘猛转.

  7. Java高效开发-常用idea插件

    这里推荐几个常用的idea插件,可以大大提高开发的效率 所使用的idea版本为 2021.2.3 1.Jrebel and Xrebel for IntelliJ Jrebel用于热部署,避免频繁重启 ...

  8. 聊一聊如何用C#轻松完成一个SAGA分布式事务

    背景 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 ACID ,只能够通过分布式事务来解决. 市面上使用比较 ...

  9. Java继承的概念与实现

    // 方法 public class Demo { public static void main(String[] args) { Teacher t = new Teacher(); t.name ...

  10. 【ASP.NET Core】使用最熟悉的Session验证方案

    如果大伙伴们以前写过 ASP 或 PHP 之类的,相信各位对基于 Session 的身份验证很熟悉(其实在浏览器端是结合 Cookie 来处理的).这种验证方式是比较早期的,操作起来也不复杂. a.用 ...