子串 DAG 的边数是 S^4/3

字符集大小不限,有 \(n\)不同的 字符串 \(s_i\),总长度为 \(S \ge n\),你可以任意构造。

如果 \(s_u\)\(s_v\) 的子串,那么连一条有向边,这样的 DAG 边数 \(E\)\(O(S^{4/3})\) 的,且是紧的。

在互联网上冲浪了一会儿,没有找到在明显处提及这个结论的资料,感到非常震惊(nani)

下文无关的起因是在 2026 HDU 暑假多校 7 - A 题,发现了一份 \(O(E \sqrt S)\) 的代码,跑得飞快。

松松的

首先,容易发现 \(E\) 不会超过 \(O(S^{3/2})\)。因为长度为 \(x\) 的串,只有 \(O(x^2)\) 个子串,至多造成 \(\min(n, x^2)\) 的贡献。

我们大致让 \(\sqrt S\) 个串取到 \(\sqrt S\) 的长度,此时就分析出 \(O(S^{3/2})\) 的上界了。

但是这样分析,前面那个题的复杂度就是平方了,没道理通过,想必有蹊跷。

紧紧的

取阈值 \(B\),称比 \(B\) 短的是小串,否则是大串,我们让 DAG 的边从大串指向小串。

对于每条边,如果指向小串,则称为短边。否则一定是大串指向大串,称为长边。

短边

对于一个串 \(s_i\),有最多 \(B * |s_i|\) 个子串是小串,即贡献的短边数量。

对所有串的短边数量求和,得到 \(E_1 \le B * S\)

长边

这部分数量有限,至多有 \(\frac{S}{B}\) 个大串,故内部连边的数量 \(E_2 \le \frac{S^2}{B^2}\)

于是我们有 \(E \le BS + \frac{S^2}{B^2}\),对任何 \(B\) 都成立。平衡得到 \(B = S^{1/3}\),此时 \(E = O(S^{4/3})\),得证。

所以一开始那个复杂度 \(O(E \sqrt S)\) 算出来是 \(O(S^{11/6})\)。哇!真神奇!

咔咔

只用两种字符 \(a,b\),随机不同的串就能卡得比较满。如果不希望随机的话,可以这样生成数据:

  • 1 → a
  • 10 → ab
  • 11 → aa
  • 100 → abb

感谢 welp 同志率先提出了关于分析复杂度的讨论!学术学术!

posted @ 2026-08-11 22:18  Aurora5090  阅读(65)  评论(0)    收藏  举报