AC自动机
做往年大学生CSP题目的时候,遇到一道比较简单的AC自动机+DP的题,结果调半天过不了,最后发现AC自动机写错了…
首先建trie
树,找fail
的时候,应该是按照深度(即点对用的字符串长度)从小往大遍历,才满足拓扑序(一般用bfs
实现),而我当时直接智障按照点的编号遍历了…
特别地,当字符集不是很大的时候,并且我们需要用到每个点后接每一个字符要跳到那(而不是只需要fail
树),可以考虑在找fail
的时候同时处理to数组,效率为
O
(
n
∗
字
符
集
大
小
)
O(n*字符集大小)
O(n∗字符集大小)。
如果字符集很大,且只需要fail
树,找fail
的时候就用主席树维护每个点到根的路径上每个字符深度最大的to
,效率为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。