给定一个字符串
S
S
S,要求构造字符串序列
s
1
,
s
2
,
…
,
s
k
s_1,s_2,…,s_k
s1,s2,…,sk满足任意
s
i
s_i
si 都是
S
S
S的子串,且
s
i
s_i
si在
s
i
−
1
s_{i-1}
si−1中出现至少两次。
求最大
k
k
k
∣
S
∣
≤
2
e
5
|S|\le2e5
∣S∣≤2e5
Solution
首先所有的
s
i
s_i
si的序列都可以缩成
s
i
s_i
si是
s
i
−
1
s_{i-1}
si−1后缀的形式,所以考虑直接在后缀树上进行DP。
需要证明一个重要的结论:对于SAM上的节点
x
x
x,只有它的
m
a
x
l
e
n
maxlen
maxlen是可能作为转移状态的。
只需要证明对于
x
x
x的祖先节点
y
y
y,任意
y
y
y的
[
m
i
n
l
e
n
,
m
a
x
l
e
n
]
[minlen,maxlen]
[minlen,maxlen]中的字符串在
x
x
x代表的最长字符串中出现次数都相同。
考虑如果
a
,
b
a,b
a,b都是
y
y
y代表的字符串,
∣
b
∣
=
∣
a
∣
+
1
|b|=|a|+1
∣b∣=∣a∣+1,
b
b
b比
a
a
a少出现一次,多出来的字符一定在
s
t
r
m
a
x
x
str_{max}x
strmaxx的外面,那么由于已经是最长的了,所以这个长度为
∣
s
t
r
m
a
x
x
∣
+
1
|str_{max}x|+1
∣strmaxx∣+1的串属于
z
z
z,
z
z
z为
x
x
x子树内节点,那么存在一个
e
n
d
p
o
s
=
e
n
d
p
o
s
(
z
)
−
e
n
d
p
o
s
(
x
)
endpos=endpos(z)-endpos(x)
endpos=endpos(z)−endpos(x)使得存在
b
b
b而不存在
a
a
a,与
a
,
b
a,b
a,b相同
e
n
d
p
o
s
endpos
endpos矛盾。
那么接下来就直接可持久化线段树合并
e
n
d
p
o
s
endpos
endpos,再根据单调性将转移到当前节点
x
x
x的
y
y
y贪心地移动即可。判断只需要在随便选择一个
e
n
d
p
o
s
(
x
)
endpos(x)
endpos(x),判断这个区间内的情况就好了。