定长区间最小整周期问题的线性解法

这是一篇学习笔记

本文非常地粗糙和民科,算法很可能是假的。如果您知道已有的其他解法或者找到了我的证明的问题,请告知我是小丑。

最近做 CF1909G 的时候想复杂了,结果发现了一些奇怪的性质,感觉不大平凡?

引理:一个足够长的串 $s$,$s_1\ne s_{n+1}$。若 $s_{1\cdots n}$ 的最小整周期为 $p<n$,有某个 $1<i\le n$,$s_{i\cdots i+n-1}$ 的最小整周期为 $q<n$,那么 $i>n-p-q+\gcd(p,q)+1$。

:反证,假设 $i\le n-p-q+\gcd(p,q)+1$。

$p\mid q$ 的情况下,$i\le n-q+1$,$s_{n+1}=s_{n-q+1}=s_{1}$,矛盾。

$p\nmid q$ 的情况下,$s_{i\cdots n}$ 这一段长度至少为 $p+q-\gcd(p,q)$,且有 $p$ 和 $q$ 作为周期,由强周期引理,$p$ 不是 $s_{1\cdots n}$ 的最小整周期,矛盾。

$i$ 取到 $n-p-q+\gcd(p,q)+2$ 的情况应该可以构造,不过我现在还没找到通用的形式。

一个有趣的推论是 $i>n/3+1$,这可以通过讨论所有 $p,q>n/6$ 证明。取到 $i=n/3+2$ 的情况是这样的: $$ \texttt{a}t\texttt{b}t\texttt{a}\textcolor{red}{t\texttt{a}t\texttt{b}t\texttt{a}t}+\textcolor{red}{\texttt{b}t\texttt{a}t\texttt{b}} $$ $t$ 表示任意串。前面一个串 $p=n/2$,红色部分 $q=n/3$。

然后发现了一个求定长区间最小整周期的线性算法(定长长为 $n$):

首先 $p=n/2$ 的情况要暴力判掉。

从左往右移窗口。对于当前子串 $s_{l\cdots r=l+n-1}$,反过来跑 KMP。

case 1. 如果找到了 $<n$ 的最小整周期(这里找到 $n/2$ 也无所谓),那就可以一步步移左右端点,看能否维持当前周期,如果不行,根据引理可以至少一次性往后跳 $(n-p)/2$。称这个为优化 A。

case 2. 否则,如果下一个具有最小整周期 $p\le n/3$ 的区间与 $[l,r]$ 有交,那么交的部分一定也有 $p$ 的周期。并且,如果交的部分长 $\ge 2n/3$,那么 $p$ 一定是它的最小周期(否则可以用弱周期引理导出更小的 $p$)。现在,找到当前区间的最长后缀 $[t,r]$,满足这个后缀的最小周期是 $\le n/3$ 的 $n$ 的因数,把区间左端点移到 $\min(t,l+n/3)$。称这个为优化 B。注意优化 B 是不能兼容 $p=n/2$ 的,因为交里的循环节不足 $2$ 次,无法保证最小周期。比如当前子串为 $\texttt{aaaaaaaaaabaaaaa}$,那么后续必须逐一检查。

性质:连续进行两次优化 B,左端点移动超过 $n/3$。

:如果两次中有至少一次左端点移到的这个 $\min$ 式子取的后一项,那么已证毕。

否则考虑反证,如果左端点移动 $\le n/3$,设两次分别移动到 $[l^\prime,r^\prime],[l^{\prime\prime},r^{\prime\prime}]$,$[l^\prime,r]$ 和 $[l^{\prime\prime},r^\prime]$ 的最小周期分别为 $p,q\le n/3$。由于 $r-l^{\prime\prime}+1\ge 2n/3$,故 $[l^{\prime\prime},r]$ 具有周期 $\gcd(p,q)$,故 $[l^\prime,r^\prime]$ 具有周期 $\gcd(p,q)$,不应有第二次优化 B,矛盾。

综上,无论何种情况,都可以一次性跳过至少 $n/3$ 个位置,总时间复杂度为 $\mathrm{O}(n\cdot \lvert s\rvert/n)=\mathrm{O}(\lvert s\rvert)$。

优化 A 应该是不必要的(可以直接从 $l+1$ 继续),因为如果 case 1 紧跟 case 2 的话,case 2 应当一定会跳 $\min$ 的后一项。这个我没仔细证。

Licensed under CC BY-NC-SA 4.0

评论

使用 Hugo 构建
主题 StackJimmy 设计