题意
给定一个长度为
n
n
n的字符串(字符集大小为
n
n
n级别),求其在最小表示法意义下本质不同的子串个数。
n
≤
50000
n\le 50000
n≤50000
题解
如果不是最小表示法则是一个经典的后缀排序问题,考虑沿用该思路拓展到最小表示法上。
考虑如何排序:对于两个后缀,首先找出最小表示法意义下的
l
c
p
lcp
lcp,关键在于如何用哈希来表示最小表示法。对于一个串,我们关心的是同一个数字出现的位置,于是将在位置
u
,
v
u,v
u,v的相邻的相同数字,其贡献记为
(
v
−
u
)
∗
p
[
u
]
(v-u)*p[u]
(v−u)∗p[u],这样就完全与最小表示法等价了。二分答案时要计算一段区间的哈希值,用主席树维护即可。之后再按照加上下一位后的哈希值来判断大小,这与原来排序的原则类似。
效率
O
(
n
l
o
g
3
n
)
O(nlog^{3}n)
O(nlog3n),卡常技巧:stable_sort(神奇的STL)。