贴一个HDU2222 ac自动机模板题。
1A,没什么错误。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
char s[1000010];
struct ACautomata{
int next[500010][26],fail[500010],cnt[500010],last[500010],num,root;
int newnode()
{
memset(next[num],0,sizeof next[num]);
cnt[num]=0;
return num++;
}
void init()
{
num=0;
root=newnode();
}
void insert(char *s)
{
int len=strlen(s),cur=root;
for(int i=0;i<len;++i)
{
int &tmp=next[cur][s[i]-'a'];
if(!tmp)tmp=newnode();
cur=tmp;
}
++cnt[cur];
}
void getfail()
{
queue<int>q;
fail[root]=root;
for(int i=0;i<26;++i)
{
int u=next[root][i];
if(u)
{
fail[u]=last[u]=0;
q.push(u);
}
}
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int i=0;i<26;++i)
{
int u=next[cur][i];
if(!u)next[cur][i]=next[fail[cur]][i];
else
{
fail[u]=next[fail[cur]][i];
last[u]=cnt[fail[u]]?fail[u]:last[fail[u]];
q.push(u);
}
}
}
}
int query(char *s)
{
int len=strlen(s),cur=root,ret=0;
for(int i=0;i<len;++i)
{
cur=next[cur][s[i]-'a'];
int tmp=cur;
while(tmp!=root)
{
ret+=cnt[tmp];
cnt[tmp]=0;
tmp=last[tmp];
if(cnt[tmp]==0)break;//这里注意有的题目不能break
}
}
return ret;
}
}ac;
int cas,n;
int main()
{
scanf("%d",&cas);
while(cas--)
{
ac.init();
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%s",s);
ac.insert(s);
}
ac.getfail();
scanf("%s",s);
printf("%d\n",ac.query(s));
}
}