高级的字符串算法几乎都与一个重要的概念:确定有限状态自动机(DFA)有关。这是一种重要的数学模型。
概述
这里只讲一些概念,但是非常有用。
OI 中的自动机一般指确定有限状态自动机(DFA)。自动机是一个对信号序列进行判定的数学模型。“信号序列”指的是一连串有顺序的信号,比如字符串从前到后的每一个字符。“判定”是对命题做出真假回答,比如判断一个字符串是否是回文串。
一个 DFA 可以被抽象成一张有向图,由五元组 构成:
- 字符集 ,该自动机只能输入这些字符;
- 状态集合 ,状态相当于图上的顶点;
- 起始状态 (也可以记作 ),;
- 接受状态集合 ,;
- 转移函数 , 接受一个状态和一个字符,返回一个状态,转移函数相当于有向图上的边,边的权值是字符。
DFA 可以识别字符串。自动机 如果能识别 ,那么 。DFA 读入字符串时,从初始状态起按照转移函数一个一个字符地转移。如果杜曼一个字符串地所有字符后到达了 中的一个点,那么 DFA 就识别了这个字符串。
比如说 Trie 就是一个自动机,每一条边都是转移函数, 是标记为字符串的节点集合。
KMP 自动机
KMP 自动机的状态集合 为 ,如果当前识别的字符串为 ,那么每个节点 表示已经输入的所有字符 与 的最大匹配长度为 ,即满足 ,转移函数为:
int tr[1005][26];
for (int i = 0; i <= n; ++i)
for (int j = 0; j < 26; ++j) {
if (i < n && s[i + 1] == j + 'a') tr[i][j] = i + 1;
else if (i) tr[i][j] = tr[nxt[i]][j];
}
AC 自动机(ACAM)
它用于解决多模式串