写在前面
仍然是写给自己的,看不懂别怪我。
最简短的 AC 自动机!
AC 自动机用于多模匹配。 模式串被插入一个添加了一些转移边的 Trie 中。在匹配的时候,若失配,则使下一个字符跳到该节点的 fail 指针处,使匹配继续。
最重要的就是建自动机的过程。如下:
void build()
{
queue<int> q;
fo(i, 0, 25) if(tr[0][i]) q.push(tr[0][i]); // 注意一开始要把 0 的所有儿子入队列。
while(!q.empty())
{
int u = q.front(); q.pop();
fo(i, 0, 25)
tr[u][i] ? (q.push(tr[u][i]), fail[tr[u][i]] = tr[fail[u]][i]) : //如果有 i 这个儿子,其 fail 就是此节点的 fail 的 i 儿子。
tr[u][i] = tr[fail[u]][i]; //否则不如直接把边连向 fail 的 i 节点。
}
}