专栏文章
P11087 题解
P11087题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipratdv
- 此快照首次捕获于
- 2025/12/03 16:40 3 个月前
- 此快照最后确认于
- 2025/12/03 16:40 3 个月前
考虑用可持久化平衡树维护这个字符串的复制,这里若使用按子树大小赋权随机合并的可持久化 fhq,那么每次倍增会产生 个结点,若使用可持久化 WBLT,合并复杂度为 ,则每次倍增会产生 个结点,总的结点数为 。
于是现在问题变为快速合并两个结点的信息,我们考虑维护每个结点 所对应的字符串 中,模式串 的出现次数,以及 最长的在 中作为子串出现过的前缀和后缀(并把它们在 中出现位置的左右端点记录下来,如有多个,随便记录一个即可)。
我们建出 的后缀数组,合并的时候,对于最长的出现过的前缀,我们考虑二分出它在 所有后缀中的排名。比较大小时,我们相当于要比较 和 的一个后缀的大小关系,只需先求出 LCP,然后比较下一位字符的大小即可。然后再求出 与它在后缀数组中前驱后继的 LCP,较长的那个即为最长的出现过的前缀,后缀的求法是同理的,只需对反串建立后缀数组。
我们还需统计跨越合并位置的 的出现次数,设我们合并的是 两个点,则我们只需求出 的一个最长后缀,使得它是 的一个前缀,和 的一个最长前缀,使得它是 的一个后缀。
我们以 为例,先二分出它在 后缀数组中的排名,然后求出它与前驱的 LCP,设 LCP 的长度为 ,则我们只需求出这个前驱的最长的长度 的 Border,这可以在失配树上倍增得到。
最后,设 匹配 前缀的最长后缀长度为 , 能匹配 后缀的最长前缀长度为 ,设在反串失配树上 的所有祖先(含自己)构成的集合为 ,在正串失配树上 的所有祖先(含自己)构成的集合为 ,则我们只需求出 的 对数。我们可以将所有询问离线下来,然后在正串失配树上 DFS,维护反串失配树上每个点的答案,只需支持子树加和单点查询,用树状数组维护即可。
每次合并结点时都要一个二分和树状数组的代价,都是 的,故总时间复杂度为 。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...