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}\)


一些推论:

posted @ 2024-06-03 19:48  fjy666  阅读(70)  评论(0编辑  收藏  举报