【题解】P5211 [ZJOI2017] 字符串
TallBanana · · 题解
引入科技——最小后缀
定义
- 记
suf(S) 表示S 的后缀集合。 - 记
minsuf(S) 表示S 的最小后缀。 - 记
Ssuf(S) 为\{V\in suf(S)|\exist T,VT=minsuf(ST)\} ,称为S 的潜在最小后缀。\ 即在S 后增加一个串T (可以为空)后,可能成为最小后缀的串的集合。
性质
-
对于任意两个 Ssuf 中的元素U,V ,$U < V \Leftrightarrow U 是 V的前缀。 ::::info[证明] 如果 U不是 V的前缀,则 UT和 VT的大小是由 U,V的大小关系决定的,那么只有一者可能是 \in Ssuf的。 这里,注意 U是 V的后缀,所以 U是 V$ 的 border。 - 对于任意两个
Ssuf 中的元素U,V ,|U|<|V|\Leftrightarrow 2|U|\le|V| 。 ::::info[证明] 反证,假设|U|<|V|<2|U| ,由上面的定理可得U 是V 的 border。于是对应|V|-|U| 长度的周期,我们把这个周期记作T 。因为|T|\le |V| 且|T|\le |U|/2 ,于是我们可以改写U=TC,V=T^2C 。
由最小后缀,存在R (可空)满足::::: - 推论:
|Ssuf(S)|=O(\log|S|) 。
题解
题面传送门:[ZJOI2017] 字符串
先写个分块,支持
考虑使用线段树维护
修改的时候,只有被修改区间包含的
由倍长定理&线段树两个儿子长度差距只有最多 1 可得,
对于
于是我们可以一直排除
- 若
V 是P 的前缀,则什么也不干。 - 若
V 不是P 的前缀,且V<P ,抛弃P ,停止。 - 若
V 不是P 的前缀,且V>P ,抛弃V 。
最终如果