一、介绍
1.难学的东西
后缀自动机是一种非常毒瘤有用的算法。它以难学著称,所以本蒟蒻学了两个星期还没有学通。有些人了解AC自动机,但是不了解后缀自动机。因为这是AC自动机的变态扩展版。
2.用途多多的算法
我们都知道,很多自动机模板都只能解决一种问题(废话)。但是后缀自动机不一样,只需在模板上加上三四条语句,它就能解决许许多多的毒瘤题。
二、算法引理
1.声明
这些引理过于变态,本蒟蒻没有办法生动形象地写在博客里。
所以我引用了另一位大佬的博客
就是这位巨学
若本蒟蒻的算法引理部分侵犯了您的权益,可以从评论告诉我,我会立刻删除
2.引理
1.如果两个子串的
e
n
d
p
o
s
endpos
endpos 相同,则其中子串一个必然为另一个的后缀
2.对于任意两个子串
t
t
t 和
p
p
p
(
l
e
n
t
≤
l
e
n
p
)
(len_t≤len_p)
(lent≤lenp),要么
e
n
d
p
o
s
(
p
)
∈
e
n
d
p
o
s
(
t
)
endpos(p)∈endpos(t)
endpos(p)∈endpos(t) ,要么
e
n
d
p
o
s
(
t
)
∩
e
n
d
p
o
s
(
p
)
=
∅
endpos(t)∩endpos(p)= ∅
endpos(t)∩endpos(p)=∅
3.对于
e
n
d
p
o
s
endpos
endpos 相同的子串,我们将它们归为一个
e
n
d
p
o
s
endpos
endpos 等价类。对于任意一个
e
n
d
p
o
s
endpos
endpos 等价类,将包含在其中的所有子串依长度从大到小排序,则每一个子串的长度均为上一个子串的长度减 11 ,且为上一个子串的后缀(简单来说,一个
e
n
d
p
o
s
endpos
endpos 等价类内的串的长度连续)
4.
e
n
d
p
o
s
endpos
endpos 等价类个数的级别为
O
(
n
)
O(n)
O(n)
5.一个类
a
a
a 中,有最长的子串,也有最短的子串,我们称最长子串的长度为
l
e
n
(
a
)
len(a)
len(a) ,最短子串长度为
m
i
n
l
e
n
(
a
)
minlen(a)
minlen(a) 。对于存在父子关系的两个类,设
f
a
(
a
)
fa(a)
fa(a) 表示类
a
a
a 的父亲(也是一个类)。则:
l
e
n
(
f
a
(
a
)
)
+
1
=
m
i
n
l
e
n
(
a
)
len(fa(a))+1=minlen(a)
len(fa(a))+1=minlen(a)
6.后缀自动机的边数为
O
(
n
)
O(n)
O(n)
3.感情的凝华
如果巨佬您是初学者,上面一小段文字是稍有难度。
《如何使作文感情得到凝华》——ZT(神犇,比我强就是了)
但只要抱着必死的决心, 就一定能看懂上文,学懂它!
三、实现
void add(int c)
{
int p=las;int np=las=++tot;dian[np].len=dian[p].len+1;
for(;p&&!dian[p].ch[c];p=dian[p].fa)dian[p].ch[c]=np;
if(!p)dian[np].fa=1;
else {
int q=dian[p].ch[c];
if(dian[q].len==dian[p].len+1)dian[np].fa=q;
else {
int nq=++tot;dian[nq]=dian[q];
dian[nq].len=dian[p].len+1;dian[q].fa=dian[np].fa=nq;
for(;p&&dian[p].ch[c]==q;p=dian[p].fa)dian[p].ch[c]=nq;
}
}
}
四、应用
这里提供两种应用
1.判断子串
跑一遍,未跑到 N U L L NULL NULL便是。这个很简单。
2.不同子串个数
D
A
G
DAG
DAG套
D
P
DP
DP。
f
[
i
]
f[i]
f[i] 表示从
i
i
i 出发的子串个数(不含空串)。
a
n
s
=
f
[
1
]
,
f
[
i
]
=
∑
(
i
,
j
)
∈
E
d
g
e
(
f
[
j
]
+
1
)
ans=f[1], f[i]=\sum_{(i,j)∈Edge}{(f[j]+1)}
ans=f[1],f[i]=∑(i,j)∈Edge(f[j]+1)
o
r
or
or
a
n
s
=
∑
(
l
e
n
(
i
)
−
l
e
n
(
f
a
(
i
)
)
)
ans=\sum{(len(i)-len(fa(i)))}
ans=∑(len(i)−len(fa(i)))
五、结束语
温馨提示
后缀自动机,真是一种需要大量脑力的算法。当然最好把它理解下来。如果不能也没关系,会背模板,会应用,便能应付一些题目。但是,要想体会到算法之美,要想融会贯通,恐怕真的不是每个人都能做到的了。
关于此文
作者
海洋
简介:初一蒟蒻,次次爆零,总被巨学虐爆。
鸣谢
洛谷
ZT(好友)
启发我的博客