专栏文章
CSP2025 T3 题解
P14363题解参与者 1已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @minf8q0e
- 此快照首次捕获于
- 2025/12/02 01:26 3 个月前
- 此快照最后确认于
- 2025/12/02 01:26 3 个月前
前言
唉,
思路
设询问串为 ,给定的串为 。
证明一个 对一个 的贡献最多为 是平凡的,询问即对 计算有多少个满足条件的 。
设 ,记 , 为 和 扣掉 之后剩下的左边的子串(由定义,这两个串是同一个串), 为右边的(同理)。则 对 的贡献是 ,当且仅当 , 是 的后缀, 是 的前缀。
因为 只需要判是否等于,开局先对所有二元组 哈希。看到前后缀匹配,可以使用 Trie。在 Trie 上, 是 的前缀相当于 对应的节点在 对应的节点子树内,如果对字符串按其在 Trie 中对应点子树内的 dfs 序区间标号,可以表示成 。那么分别对前面定义的所有 和 这样标号,就变成了普通的三维偏序且一维限制是等号的问题,可以用动态开点线段树维护每种 , 解决。但其实我们如果不对 显式标号,把动态开点线段树换成对 建 棵 值不同的动态开点 Trie,在扫描线每次查询时统计从第 棵动态开点 Trie 的根到查询的 对应节点路径上的点的贡献,这部分除去离散化就可以做到线性(实际上也可以上 trie 求 的 dfs 序去掉离散化的 log 并且摆脱哈希,但是没啥必要)。
总复杂度 ,精细实现后 。
yjh 提醒我遍历 trie 求 dfs 序复杂度多了个字符集。当然可以对 trie 每个点开个链表来解决这个问题,但是太蛋疼了,可以考虑对每个点的邻接矩阵压位模拟链表,插入、删除、遍历都可以使用位运算解决。
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...