BZOJ 1396 识别子串 题解

Statement

\(S\),令 \(x\)\(S\) 的第 \(k\) 个字符,称 \(T=S[i..j]\) 为关于 \(x\) 的识别子串,当且仅当:

  • \(i\le k\le j\)(含 \(x\) 这一位)
  • \(T\)\(S\) 中只出现一次

\(S\) 关于每一位字符的最短识别子串长度,\(|S|\le 10^5\).

Solution 1

以下是我没看题解瞎胡的

首先一个非常弱智的想法是,建 SAM,\(T\) 相当于 \(\text{endpos}\) 集合大小为 1,再维护个出现位置,全拎出来,用两个线段树区间取 \(\min\),注意这里单 log 因为可以标记永久化。

但是这是 SA 练习题所以要用 SA 做一遍。

怎么做呢,后面忘了

Solution 2

以下是我看别的做法,转述的

SA 做法:对于每个后缀 \(i\),都可以求出从 \(i\) 向后延伸的最短识别子串,为 \(\max(\text{height}(\text{rk}(i)),\text{height}(\text{rk}(i)+1))+1\),注意 \(i\) 可能没有向后延伸的识别子串。

于是正一遍,反一遍,线段树区间取 \(\min\) 即可。

posted @ 2024-09-08 22:02  Laijinyi  阅读(1)  评论(0编辑  收藏  举报