AC 自动机
作者:互联网
AC 自动机
目录自动机
OI 中「自动机」一般指「确定性有限状态自动机」(deterministic finite automaton,DFA)
基本定义
DFA 一般是识别字符串,一个自动机 \(A\),若他能识别字符串 \(S\),则 \(A(S)=1\),否则 \(A(S)=0\) .
然后这个识别咋定义呢?当一个自动机读入一个字符串时,从初始状态(根节点)起按照转移函数一个一个字符地转移 . 如果读入完一个字符串的所有字符后位于一个接受状态,那么我们称这个自动机 接受 这个字符串,反之我们称这个自动机 不接受 这个字符串 .(这个接受其实就是识别吧)
形式化定义
其实弄懂了基本定义,形式化定义就很明了了 .
一个 DFA 由如下五个东西
- 状态集合 \(Q\) .
- 字符集 \(\Sigma\) .
- 状态转移函数 \(\sigma : Q\times \Sigma\to Q\) .
- 一个开始状态 \(s\in Q\)(即根节点)
- 接收状态集合 \(F\subseteq Q\) .
组成的五元组 \((Q,\Sigma,\sigma,s,F)\) .
常见自动机
- Trie:转移函数就是 Trie 上一条边,其能接受的字符串就是插入到 Trie 中的字符串(或者其前缀,这取决于怎么定义接受)
- 子序列自动机:能接受的字符串是给定字符串的所有子序列,转移函数 \(trans(x, c)\) 是在字符 \(c\) 对应的 \(\texttt{vector}\) 里 \(\texttt{upper_bound}(x)\) 得到的返回值 . 每个节点都可以看作接受状态 .
- KMP 自动机:由 \(s\) 构造 的自动机能接受的字符串是以 \(s\) 为子串的串 \(t\),转移函数就是不断跳 next 的过程(形式化的,here)
然后就是我们现在要说的 AC 自动机,还有比较牛逼的(广义)后缀自动机(SAM),回文自动机(PAM)啥的,然而我不会啊 qwq
Reference
- skyh 神仙的课件《字符串算法基础》
- 自动机 - OI Wiki
- AC 自动机 - OI Wiki
标签:AC,定义,形式化,字符串,接受,自动机 来源: https://www.cnblogs.com/CDOI-24374/p/15968827.html