Solution Set - Border Theory
我发现写 Solution Set 就不用写每道题的题意了,岂不美哉?
首先是一些奇妙结论。
定理 1(弱周期定理) 对于字符串 ,若 和 都是 的周期,且 ,则 也是 的周期。
证明 考虑更相减损,不妨令 ,则只需证 为周期。注意到 ,总有 成立,对于前者,;对于后者,。故 为周期。
这个定理“弱”在 的范围,该范围可以扩大到 ,在此略过。
定理 2
- 字符串 中所有 的 border 可排列为一个等差数列。
- 若字符串 的最长 border ,则 是周期;集合 均为 border;且 内的所有 border 。(注意区间左端点。)
- 对于字符串 ,集合 可排列为一个等差数列。
证明
-
记 。取最大的满足条件的 border ,那么由 定理 1,对于任意满足条件的 border ,有 ,且任意满足 的 均为 border。因此,可得一个公差为 的等差数列。
-
这是与上一定理形似,但应用更广的扩展。显然 是周期且所有 为 border,我们还需要说明 内不存在其他形式的 border。反证,若存在一个 为 border,则能取出一个 ,使得 同属一个周期且 。通过说明 也是周期,我们能找到一个大于 的 border,继而导出矛盾。具体讨论见下图:
例如 (网格线单位为 ),通过在 border 和周期间代换,我们发现在串 中, 是大于半串长的 border,而 便是其周期。继而 ,所以 是原串周期。接着上文的讨论,我们导出了矛盾。
-
类似地,取最大的满足条件的 ,那么任意 均为 的 border,且 的 border 均满足条件。此后同理可证。
举一个 定理 2.(1) 的经典使用例子:确保无法均摊复杂度的 KMP(e.g. Trie 上 KMP)复杂度不超过 。
定理 3 长度为 的字符串 的所有 border 可划分为 个等差数列。
证明 令 定理 2.(3) 中的 为 ,分别可证长度在 的 border 构成等差序列。由于是复杂度上界我们也没必要考虑边界取不取, 因此得证。此外,我们还能说明,可以按从大到小或从小到大的顺序贪心构造等差数列,这种构造方法能够确保复杂度。
个人感觉不涉及自动机等模板化算法的字符串题都比较神奇,而 border 又算最神奇的考点,所以相关结论(esp. 定理 3)还是在脑中留个印象比较好√
「洛谷 P5829」「模板」失配树 + 额外限制:空间 。
不妨记 的最长 border 为 ,若没有严格空间限制,显然可以在边 构成的树上求每对 的 LCA。
额外的限制要求我们对上文定理的灵活使用。不妨设 ,取当前 ,讨论
- ,可见简单地令 是可以保障复杂度的;
- ,注意 是 的最大 border,由 定理 2.(2),若 ,则答案为 ;否则令 。(我们无法保证 内无其他形式的 border。)
复杂度显然为 ,明显于一般的求 LCA 方法(你写四毛子当我没说 w)。
这种匹配计数题一般是用 border 来转移 DP。设 , 为 的真 border 集合。从暴力入手,令 表示生成了前 个字符,恰好得到一个 的方案数。容斥计数,对于 ,显然有
第一个和式可以前缀和优化,第二个和式,利用 定理 3 拆分为 个等差数列上的 之和,亦可前缀和优化。最终复杂度为 。
询问显然可以视为树形结构,相当于需要在树上 KMP。
发现当两个子串匹配时,它们的二元组表达几乎是一致的,只有左右两端可能不同。所以我们的第一个问题是设计一个基于二元组的 定义。定义两个二元组串 和 有 ,当且仅当
其实这个 "" 选得不好,烦请注意 没有反身性。此后,对于二元组串 ,定义 为最大的 ,满足
先不考虑复杂度,这个 是能够通过正常 KMP 求出来的。接着思考已知 时如何求最后一个二元组内部的 border 贡献。显然,沿着 一路跳 ,维护最后一个二元组已经有多长的前缀找到了 border,考虑当前跳到的位置 的下一个二元组 能否使更长的前缀找到 border,若能,有多长的前缀找到 border,即可计算答案。
现在的唯一问题是复杂度。我们去思考该定义下的 能否用 定理2.(1) 加速跳跃过程。答案是《能但不完全能》。举个例子
看图,此时 的最长 "border" 为 ,,,故第一个二元组 。我们只知道,第一个二元组 在 中点左侧,它无法构成严格等于的周期。因此,我们只能断言通过周期跳跃,着陆在 之后的某个位置是安全的。当然,这一限制可以收紧,但已经能够保证复杂度。最终复杂度即为 。
对于竹竿长度 ,初始有 ,每次操作可以令 加上 ,其中 为 的任意 border,问最终 内有多少可取的 。可以发现,这是一个同余最短路模型。
但要小心,如果我们直接开始“优化建图”,很可能忽略原本显而易见的性质。套一般性模板的代价自然是失去特殊性。所以暂时别去想“跑最短路”,只是思考如何求到在某个有意义的模数 下,最小的使得 的 的值。
联系已有结论,感觉等差数列在同余意义下会带来特殊性,所以想到先用 定理 3 拆出等差数列。设 均为 的值(注意不是 border 的值),把初始的 作为模数模掉,按照 在模 意义下划分出的 个环,用 来更新同一个环上的 ,注意到边带正权,所以初始最小的 不会被更新,可以使用单调队列优化。
然而这种想法导向另一个问题:我们需要实现不同模数下 的转化。考虑 的意义: 都能取到,转化到 下,即 都能取到。那么初始有 ,再用 在 之间互相转移。由于 没有上限,不需要单调队列。
综上,我们虽然用同余最短路描述了问题,但仍紧贴 border 的性质完成转化。最终复杂度 。
最重要的结论:字符串题多画图√
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现