hdu 2222 hdu 3065 hdu 2896 AC自动机水题
A了3个多串匹配的水题
模板
View Code
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 1000010;
struct Tire
{
int flag,fail;
int next[26];
void init()
{
flag=0;fail=-1;
for(int i=0;i<26;i++) next[i]=0;
}
}tb[maxn];
int tot;
char str[maxn];
void insert(char s[])
{
int rt=0;
for(int i=0;s[i];i++)
{
int t=s[i]-'a';
if(!tb[rt].next[t])
{
tb[++tot].init();
tb[rt].next[t]=tot;
}
rt=tb[rt].next[t];
}
tb[rt].flag++;
}
void get_fail()
{
queue<int> Q;
Q.push(0);
while(!Q.empty())
{
int now=Q.front();Q.pop();
for(int i=0;i<26;i++)if(tb[now].next[i])
{
int p=tb[now].fail,q=tb[now].next[i];
while(p!=-1 && !tb[p].next[i]) p=tb[p].fail;
if(p==-1) tb[q].fail=0;
else tb[q].fail=tb[p].next[i];
Q.push(q);
}
}
}
void match(char s[])
{
int ans=0,rt=0,t,p,i=0;
while(s[i])
{
t=s[i]-'a';
p=rt;
while(p!=-1 && !tb[p].next[t]) p=tb[p].fail;
if(p==-1) rt=0;
else rt=tb[p].next[t];
p=rt;
while(p!=0 && tb[p].flag)
{
ans+=tb[p].flag;
tb[p].flag=0;
p=tb[p].fail;
}
i++;
}
printf("%d\n",ans);
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
tot=0;tb[0].init();
while(n--)
{
scanf("%s",str);
insert(str);
}
get_fail();
scanf("%s",str);
match(str);
}
return 0;
}