学习AC自动机的前提是要会trie数和KMP字符串匹配, 它的功能是能对好多个模式串进行同时查找。
比如对4个模式串:
he
hers
his
she
在一条母串中:shejjjjj 查找每个模式串出现的次数.
我们知道KMP算法有个next数组,和KMP类似,AC自动机有一个fail指针数组,用来对整棵trie树进行滚动。
AC 自动机:
HUD 3065:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int ch[1002*52][26],End[1002*52],cur,fail[1002*52],last[1002*52],ans[1002];
char str[2000005],str0[1002][52];
void get_fail() {
int now,tmpFail,Next;
queue<int> q;
//用bfs生成fail
//初始化队列
for(int j=0;j<26;j++) {
if(ch[0][j]) {
q.push(ch[0][j]);
fail[ch[0][j]] = 0;
last[ch[0][j]] = 0;
}
}
while(!q.empty()) {