bzoj4180: 字符串计数(口胡
我们考虑给你一个最终构造出来的串,他最小次数是怎么被构造出来的
那么就是从前往后扫,在
S
A
M
SAM
SAM上跑,如果跑不动了那就从头开始走,并且把次数累加
显然这样构造是最小的…
那么我们预处理一个数组
d
i
s
[
i
]
[
j
]
dis[i][j]
dis[i][j],表示在
S
A
M
SAM
SAM上以
i
i
i字符开头,并且要求下一个串的开头是
j
j
j的最小串长
然后就可以愉快二分+矩乘/倍增floyd了
注意
n
n
n有
1
e
18
1e18
1e18,所以弄的时候如果加起来大于
1
e
18
1e18
1e18了就赋成
1
e
18
1e18
1e18,这样就避免高精度的出现
bzoj4032: [HEOI2015]最短不公共子串
四合一?
第一问直接枚举第一个串的子串,在第二个串的SAM上跑
第二问直接枚举第一个串的子串,显然在第二个串中匹配的位置越前越好,那么直接转移
第三问就设一个
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示在第一个串的第
i
i
i个位置,在第二个串的
S
A
M
SAM
SAM上的第
j
j
j个状态的最小值,扔进堆里做一个类似dij的
第四问直接
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示第一个串的第
i
i
i个位置,第二个串的第
j
j
j个位置,然后枚举
26
26
26个字符转移
bzoj4698: Sdoi2008 Sandy的卡片(口胡
差分一下就成了求
n
n
n个串的最长公共子串,答案就是他们加一
可以把第一个位置强行变成不一样的
然后思考了一下就是一个区间数颜色问题…把每个点挂一个vector然后最后离线扫parent树的DFS序
bzoj3879: SvT
em收获一个虚树板子??
对反串建SAN,然后把parent树搞出来
两个状态的最长公共后缀就是他们的LCA的
m
a
x
d
e
p
maxdep
maxdep
那么把虚树建出来
随意dp即可