专栏文章

CF985F Isomorphic Strings 题解

CF985F题解参与者 9已保存评论 8

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
8 条
当前快照
1 份
快照标识符
@mionjyv1
此快照首次捕获于
2025/12/02 22:07
3 个月前
此快照最后确认于
2025/12/02 22:07
3 个月前
查看原文
这是一篇确定性做法,个人感觉还是很有启发性的。
不妨定义 si=ipresis'_i=i-pre_{s_i},其中 presipre_{s_i} 表示 sis_i 上次出现的位置,若为 sis_i 第一次出现则 si=0s'_i=0
不难发现,当 sstt 同构时,应满足 si=tis'_i=t'_i
考虑怎么求出 ss'tt',它们的共同特点是原串都是 SS 中的一个子串。
观察一下,在 SS 中对应 ss 这段的 SS'ss' 有何不同:会有 O(Σ)O(|\Sigma|) 个在 ss 中第一次出现的字符,在 SS 中并非第一次出现,除此以外的均满足 Si=siS'_i=s'_i
它其实相当于将 SS' 分成 O(Σ)O(|\Sigma|) 段,每一段要么是,我当前一定是 00,要么是,我这一段就是原串。
这时候我们再转化一下题意,把 Sxixi+len1=Syiyi+len1S'_{x_i\sim x_i+len-1}=S'_{y_i\sim y_i+len-1} 换成 LCP(axi,ayi)len\texttt{LCP}(a_{x_i},a_{y_i}) \geq len,其中 aia_i 表示 SS' 中以 ii 结尾的后缀。
不难想到先对 SS' 后缀排序,再对 aia'_i 进行与 SA 同理的后缀排序,这样子就是转化成了 mink=rnk2xi+1rnk2yiheight2k\min_{k=rnk2_{x_i}+1}^{rnk2_{y_i}} height2_k
现在问题在于如何比较 aia'_i 呢?我们是知道 aia_i 被分为 O(Σ)O(|\Sigma|) 段的,有若干段是单个数 00,其他段是 SS' 的一段子串。
aia'_icmpcmph2h2 其实是同理的,我们暂且以 cmpcmp 为例。
axa'_xaya'_y 总共还是被分为了 O(Σ)O(|\Sigma|) 段,可以按照长度,直接维护那些段,对于 00 的段我们只需要看另外一位是不是也是 00 就好了。
如果不是 00,那么两边的这段都一定在原串出现过,我们直接用原串的 rnkrnkheightheight 数组,查询 LCP\texttt{LCP} 是否 len\geq len,否则直接比较 rnkrnk 大小即可。
如此往复直到遍历到 nn 结束,那么长度小的后缀更小。
stst 表初始化即可做到比较时 O(1)O(1) 查询 LCP\texttt{LCP}。总复杂度 O(nΣlogn)O(n|\Sigma| \log n),复杂度瓶颈在对 aia'_i 排序。
Submission #331238638 - Codeforces。看上去有点长其实挺简单的。

评论

8 条评论,欢迎与作者交流。

正在加载评论...