子串 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 → a10 → ab11 → aa100 → abb
感谢 welp 同志率先提出了关于分析复杂度的讨论!学术学术!

浙公网安备 33010602011771号