专栏文章
CF985F Isomorphic Strings 题解
CF985F题解参与者 9已保存评论 8
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mionjyv1
- 此快照首次捕获于
- 2025/12/02 22:07 3 个月前
- 此快照最后确认于
- 2025/12/02 22:07 3 个月前
这是一篇确定性做法,个人感觉还是很有启发性的。
不妨定义 ,其中 表示 上次出现的位置,若为 第一次出现则 。
不难发现,当 和 同构时,应满足 。
考虑怎么求出 与 ,它们的共同特点是原串都是 中的一个子串。
观察一下,在 中对应 这段的 和 有何不同:会有 个在 中第一次出现的字符,在 中并非第一次出现,除此以外的均满足 。
它其实相当于将 分成 段,每一段要么是,我当前一定是 ,要么是,我这一段就是原串。
这时候我们再转化一下题意,把 换成 ,其中 表示 中以 结尾的后缀。
不难想到先对 后缀排序,再对 进行与 SA 同理的后缀排序,这样子就是转化成了 。
现在问题在于如何比较 呢?我们是知道 被分为 段的,有若干段是单个数 ,其他段是 的一段子串。
求 的 和 其实是同理的,我们暂且以 为例。
和 总共还是被分为了 段,可以按照长度,直接维护那些段,对于 的段我们只需要看另外一位是不是也是 就好了。
如果不是 ,那么两边的这段都一定在原串出现过,我们直接用原串的 和 数组,查询 是否 ,否则直接比较 大小即可。
如此往复直到遍历到 结束,那么长度小的后缀更小。
用 表初始化即可做到比较时 查询 。总复杂度 ,复杂度瓶颈在对 排序。
Submission #331238638 - Codeforces。看上去有点长其实挺简单的。
相关推荐
评论
共 8 条评论,欢迎与作者交流。
正在加载评论...