P8023「ONTAK2015」Tasowanie
P3763 [TJOI2017] DNA
CF587F Duff is Mad
题目
SA 做字符串匹配
首先考虑如何求出
s
[
i
]
s[i]
s[i] 在
s
[
j
]
s[j]
s[j] 中出现次数
也就是对于每个后缀
s
[
i
]
s[i]
s[i] 求出
[
q
l
,
q
r
]
[ql,qr]
[ql,qr],即
r
k
[
j
]
∈
[
q
l
,
q
r
]
rk[j] \in [ql,qr]
rk[j]∈[ql,qr] ,
s
[
j
,
j
+
l
e
n
−
1
]
=
s
[
i
,
i
+
l
e
n
−
1
]
s[j,j+len-1]=s[i,i+len-1]
s[j,j+len−1]=s[i,i+len−1]
将
s
[
l
,
r
]
s[l,r]
s[l,r] 在
s
[
k
]
s[k]
s[k] 中出现次数转换成
s
[
1
,
r
]
s[1,r]
s[1,r] 在
s
[
k
]
s[k]
s[k] 中出现次数 -
s
[
1
,
l
−
1
]
s[1,l-1]
s[1,l−1] 在
s
[
k
]
s[k]
s[k] 中出现次数
扫描线,扫
k
k
k
用树状数组标记,下标是
r
k
[
]
rk[]
rk[],然后查答案,因为要枚举在
s
[
k
]
s[k]
s[k] 中出现的开始位置
时间复杂度是
O
(
n
×
l
e
n
(
k
)
×
l
o
g
n
)
O(n\times len(k)\times logn)
O(n×len(k)×logn)
根号分治,
l
e
n
≤
l
i
m
len\le lim
len≤lim 的部分直接做上面的扫描线
l
e
n
>
l
i
m
len>lim
len>lim 的串个数
≤
n
\le \sqrt{n}
≤n 个,直接预处理
对于每个
s
[
k
]
s[k]
s[k] 先将其所有后缀的
r
k
[
]
rk[]
rk[] 记在一个 vector
中
对于每个
s
[
i
]
s[i]
s[i],通过二分的方式求出贡献