QOJ 7008 另解
文中符号:
- \(\operatorname{Period}(s)\):字符串 \(s\) 的周期集合。
- \(\operatorname{Per}(s)\):字符串 \(s\) 的最小周期。
- 循环节:\(x\in \operatorname{Period}(s)\) 且 \(x| \operatorname{len}(S)\)。
- \(\operatorname{Cyc}(s)\):\(s\) 的最小循环节。
- \(\operatorname{endpos}(x)\):后缀自动机上结点 \(x\) 的 \(\operatorname{endpos}\) 集合中任意一个元素。
若有 \(TP=PT\),则 \(P\) 必定为 \(\operatorname{Cyc}(T)^k\)。
考虑先计算出所有本质不同的子串个数,再减去不合法的方案数。(这里计数 \(TP\),而不是 \(T\))。
所以我们要求所有本质不同的 \(a^k\) 个数,其中 \(k\ge 2\)。
考虑优秀的拆分的做法,我们可以在 \(\mathcal{O}(n\log n)\) 求出所有 \((l, r, k)\),满足:
- \(k\in \operatorname{Period}(s[l, r])\)
- 不存在 \(l',r'\),满足 \(l'\le l\le r\le r'\) 且 \(k\in \operatorname{Period}(s[l', r'])\)。(换句话说,这个 \((l, r)\) 是级长的)。
但是这样很难和本质不同子串扯出联系。
SAM 是对付本质不同的利器,SAM 中的一个结点 \(u\) 对应着 \(l\in [\operatorname{endpos}(u)-\operatorname{len}((u)+1,\operatorname{endpos}(u)-\operatorname{len}(\operatorname{link}(u))], r=\operatorname{endpos}(u)\) 这些子串。
猜想 I:每个节点中所代表的所有字串上,若 \(\operatorname{Cyc}\) 存在,则 \(\operatorname{Cyc}\) 唯一。
结论:猜想 I 是错误的。反例:\(s=\texttt{baababaabab}\)。存在一个节点 \(u\) 包含 \({\texttt{abaaba,babaaba,ababaaba,aababaaba,baababaaba}}\),周期为 \(3, 5\)。
猜想 II:每个节点中所代表的所有字串上,至多有两个不同的 \(\operatorname{Cyc}\),若存在两个,则一个为最大,一个为最小。(这个最大和最小可能不是很清楚,可以查看下面的步骤)。
结论:我们暂时不知道猜想 II 是否正确。(本机对拍没有找到反例)若猜想 II 被证伪,还有比较弱的猜想 III(同样,未被证明!)。 正确。
猜想 III:每个节点中所代表的所有字串上,至多有 \(\log n\) 个不同的 \(\operatorname{Cyc}\)。
不过先别急。在处理出所有三元组 \((l, r, k)\) 后,将所有 \(i\in [l + 2k - 1, r]\) 打上标记 \((l, k)\),表示 \(k\in \operatorname{Period}(s[l,i])\)。
将 SAM 的节点 \(u\) 挂到 \(\operatorname{endpos}(u)\) 下处理,扫描线维护所有标记。
当扫到 \(\operatorname{endpos}(u)=i\) 的时候做以下操作:
-
取出最小的 \(k\) 满足 \((l, k)\) 中的 \(l\le i-\operatorname{len}(\operatorname{link}(u))\)
-
计算 \(L\in [\max(l,i-\operatorname{len}(u)+1)],R=i\) 的字串有多少长度是 \(k\) 的倍数。
-
取出最大的 \(K\) 满足 \((L, K)\) 中的 \(L\le i-\operatorname{len}(\operatorname{link}(u))\)。
-
若 \(K\) 不为 \(k\) 的倍数,像第二步一样统计 \(K\) 的贡献。
实现。
特别感谢来自 lcw 的证明和 zsh 的帮助/bx/bx/bx。现对于猜想 II 给出证明。
设 SAM 上结点为 \(u\)。
-
取出 \(u\) 内 \(\operatorname{Cyc}\) 最小的串 \(s\),它的最小循环节为 \(a\)。
-
设 \(u\) 内存在另外串 \(t\),最小循环节为 \(b\)。(\(a \nmid b\))
-
显然有 \(b\in \operatorname{Period}(s)\)。
-
若 \(b \le |s| - a\),则对 \(s\) 运用周期引理可得 \(\gcd(b, a)\) 为比 \(a\) 更小的循环节。矛盾。
-
若 \(b\ge |s|\),由于 \(b\) 至少在 \(u\) 所表示的串中出现了两次,则 \(s\) 和 \(bb\) 的 \(\operatorname{endpos}\) 集合必然不同,从而矛盾。
-
所以有 \(|s|-a<b<|s|\)。
-
若有 \(c\) 满足 \(c\) 为一个本质不同的周期,则有 \(aa\) 为 \(bb\) 的后缀,\(bb\) 为 \(cc\) 的后缀。
-
根据 https://www.luogu.com/article/d4y3zqqv 定理 6.1,有 \(a+b\le c\)。
-
但是 \(c\) 同样应该满足 \(|s|-a<c<|s|\),得到矛盾。
但是为什么取最大值是正确的呢?
由于我们的“标记”只打在循环了至少两次的串上,因此 \(|s|\) 并不是一个合法的标记。
而 \(b>|s|-a\),所以 \(a\) 的所有标记都 \(<b\)。因此 \(b\) 的标记和 \(a\) 不交。
不过为啥最大值不能是 \(k\times b\) 呢?
如果 \(b\) 出现了 \(\ge 3\) 次,则 \(a\) 和 \(b\) 的 \(\operatorname{endpos}\) 集合必然必然不同。
\(\texttt{abbab/abbab/abbab}\)。
一些推论: