ac自动机

字典树+kmp算法

  1. 遍历root节点所有子节点a b c,放入queue中,并且 a b c 的fail指向root
  2. 然后queue中移除一个节点c1,然后遍历c1的所有子节点 即d2,并加入到queue中,
  3. 如果c1.fail[d2]!=null说明有公共前缀,然后完成fail节点指向(c2节点指向c1节点)
  4. 如果==null说明没有公共前缀,就把fail指向root(d2节点)
  5. 依次递归,找完所有节点,即完成ac自动机的构建

构建字典树

root
c1
d2
f3
k4
c5
d6
f7
e3
b1
c2
d3
a1
b2
h3
a4
b5
c3
d4
e5
f6

遍历字典树

第一次遍历根节点的子节点,并且把fail指向root,把a b c 放入queue中

root
c1
d2
f3
k4
c5
d6
f7
e3
b1
c2
d3
a1
b2
h3
a4
b5
c3
d4
e5
f6

重queue中取出一个节点c1,遍历c1的子节点,得到d2,放入queue

root
c1
d2
f3
k4
c5
d6
f7
e3
b1
c2
d3
a1
b2
h3
a4
b5
c3
d4
e5
f6
root
c1
d2
f3
k4
c5
d6
f7
e3
b1
c2
d3
a1
b2
h3
a4
b5
c3
d4
e5
f6

你可能感兴趣的:(算法)