专栏文章
[OOI 2023] 字符串问题
P13531题解参与者 4已保存评论 4
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @miomt688
- 此快照首次捕获于
- 2025/12/02 21:46 3 个月前
- 此快照最后确认于
- 2025/12/02 21:46 3 个月前
本题解为官方题解的 AI 中文翻译。
我们记 为字符串 的所有子串中,出现在集合 里的子串数量。对于每个询问,我们需要计算 。令 ,即 的长度为 的前缀中,出现在 中的子串数量。令 ,即从位置 开始的后缀在 中出现的子串数量。
可以发现, 等于 ,再减去那些属于 的子串,这些子串在 中的起点早于 ,终点晚于 。如果不存在这种“跨界”子串,那么答案就很容易求出,所有需要的 和 都可以通过 Aho-Corasick 算法计算得到。
如果存在上述“跨界”子串,则对于询问 ,我们需要找到这样一个 中的子串 ,它在 中的出现起点早于 ,终点晚于 。在所有满足条件的 中,选择右端点最靠左的那个。设其为 。注意, 是 的一个子串,记作 。同时, 中不存在起点早于 、终点晚于 且属于 的子串(否则 会被更靠右的 中子串覆盖)。因此,我们可以对 应用前缀和后缀的原理,递归求解。
为了在询问 时找到合适的 ,我们可以用扫描线遍历 。利用 Aho-Corasick 算法,对于每个位置 ,找到以 结尾的、属于 的最长子串(记为 )。同时,在一个堆或 set 结构中维护所有右端点不超过 的询问的起点。对于每个起点晚于 起点的询问, 都是合法的覆盖子串。所有这些询问随后从堆中移除。
因此,最终方案需要构建正向和反向的 Aho-Corasick 自动机,并用扫描线遍历 ,配合堆维护查询。总复杂度为 。
相关推荐
评论
共 4 条评论,欢迎与作者交流。
正在加载评论...