AC自动机模板题,刚学习这个东西,有的地方还不是很明白。
代码:
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int SIZE = 26;
const int MAX = 10000*50 + 10;
struct Trie{
int next[MAX][SIZE],end[MAX],fail[MAX];
int root,L;
int newnode(){//create a new node
for(int i=0; i<26; i++)
next[L][i] = -1;
end[L++] = 0;
return L - 1;
}
void init(){//initialise the trie tree
L = 0;
root = newnode();
}
void insert(char buf[]){//insert a string into the trie tree
int now = root, len = strlen(buf);
for(int i=0; i<len; i++){
if(next[now][buf[i]-'a'] == -1)
next[now][buf[i]-'a'] = newnode();
now = next[now][buf[i]-'a'];
}
end[now]++;
}
void build(){//build the Aho-Corasick
queue <int> Q;
for(int i=0; i<26; i++){
if(next[root][i] == -1)
next[root][i] = root;
else{
fail[next[root][i]] = root;
Q.push(next[root][i]);
}
}
while(!Q.empty()){
int now = Q.front();
Q.pop();
for(int i=0; i<26; i++){
if(next[now][i] == -1)
next[now][i] = next[fail[now]][i];
else{
fail[next[now][i]] = next[fail[now]][i];
Q.push(next[now][i]);
}
}
}
}
int query(char buf[]){
int len = strlen(buf), now = root;
int res = 0;
for(int i=0; i<len; i++){
now = next[now][buf[i]-'a'];
int temp = now;
while(temp != root){
res += end[temp];
end[temp] = 0;
temp = fail[temp];
}
}
return res;
}
};
Trie AC;
char buf[1000010];
int main(){
int cas, num;
scanf("%d",&cas);
while(cas--){
AC.init();
scanf("%d",&num);
for(int i=0; i<num; i++){
scanf("%s",buf);
AC.insert(buf);
}
AC.build();
scanf("%s",buf);
printf("%d\n",AC.query(buf));
}
return 0;
}