写在前面

仍然是写给自己的,看不懂别怪我。

最简短的 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 节点。
	}
}