听老师说 AC 自动机不算自动机啊,因为 Wikipedia 上的说法也是 $Aho–Corasick algorithm$ 而不是 $Aho–Corasick Automaton$.
然鹅既然大家都这么叫了我标题也就这么起喽 or2
原理
和往常一样,先坑着。。。
例题
模式串匹配
先上个洛谷模板的代码。题目很裸(毕竟是简单模板),给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过。
代码
#include
#define ll long long
#define maxn 1000010
using namespace std;
struct Node{
int vis[26];
int fail,end;
};
struct ACA{
Node AC[maxn];
int cnt;
void Build(string x){
int now=0,lx=x.length();
for (int i=0;iq;
for (int i=0;i<26;i++)
if (AC[0].vis[i])
AC[AC[0].vis[i]].fail=0,
q.push(AC[0].vis[i]);
while(!q.empty()){
int hq=q.front();
q.pop();
for (int i=0;i<26;i++)
if (AC[hq].vis[i])
AC[AC[hq].vis[i]].fail=AC[AC[hq].fail].vis[i],
q.push(AC[hq].vis[i]);
else AC[hq].vis[i]=AC[AC[hq].fail].vis[i];
}
}
int Query(string x){
int ans=0,now=0;
int lx=x.length();
for (int i=0;i>n;
for (int i=1;i<=n;i++){
string x;
cin>>x;
TAT.Build(x);
}
TAT.Get_Fail();
string s;
cin>>s;
cout<