1 条题解
-
0
自动搬运
来自洛谷,原作者为

xhgua
如果只转身后退就能回到那个夏天搬运于
2025-08-24 22:36:54,当前版本为作者最后更新于2025-01-13 19:53:43,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
写一个复杂度较劣但是跑的挺快的做法。
首先建出 的 AC 自动机,相当于求 对应节点构成的虚树和 对应节点构成的虚树的交集大小。
交集不好求,考虑用容斥原理转成求 ,即求虚树并。
首先我们考虑若知道 在 AC 自动机上对应的节点 ,如何快速求出虚树的大小(即每个点到根对应链的并大小),沿用 P5840 Divljak 的做法,我们只需按 dfs 序排序后减去相邻两点 LCA 的贡献即可。不妨设 ,同样的,对于两个虚树的并,我们考虑将小串的节点插入大串中,具体地,我们对于小串的每个节点,二分找到它应该插在大串节点 dfn 序列的哪个位置,发现最多只会有 个连续段,我们可以预处理这些连续段内部减去的贡献,并且加上插入时破坏的那部分大串的贡献即可,具体实现可以看代码。
这样子单次询问的时间复杂度即为 ,如果对相同的询问记忆化,分析后可得总复杂度是 的,其中 为 ,已经可以通过本题。
不过我当时做题的时候并没有分析出这个复杂度,发现在 和 都很大时候这个做法较劣,考虑对 的长度进行阈值分治。
令阈值为 ,当 的时候我们跑上面那个做法,复杂度为 ,当 时,这样的 最多只有 个,我们考虑用 bitset 维护这些串是否包含 ,复杂度为 ,询问时直接把两个 bitset 与起来即可。
取 可得一个复杂度为 的做法,最慢点跑了 300ms。Code。
- 1
信息
- ID
- 7531
- 时间
- 4000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者