#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
struct node
{
int flag;
node *next[100],*fail;
node():flag(0)
{
memset(next,0,sizeof(next));
fail=0;
}
};
node *root;
char table[1005][60];
char str[2000005];
int hash[1005];
void insert(char *str,int s)
{
int i,l=strlen(str);
node *p=root;
for(i=0;i<l;i++)
{
int k=str[i]-32;
if(p->next[k]==0)
p->next[k]=new node;
p=p->next[k];
}
p->flag=s;
}
void de(node *p)
{
int i;
for(i=0;i<100;i++)
{
if(p->next[i]!=0)
de(p->next[i]);
}
delete p;
}
void build_fail()
{
node *p=root;
p->fail=0;
queue<node*> q;
q.push(p);
while(!q.empty())
{
p=q.front();
q.pop();
int i;
for(i=0;i<100;i++)
{
if(p->next[i]!=0)
{
node *temp=p->fail;
while(temp)
{
if(temp->next[i])
{
p->next[i]->fail=temp->next[i];
break;
}
temp=temp->fail;
}
if(temp==0)
p->next[i]->fail=root;
q.push(p->next[i]);
}
}
}
}
void ac_find(char *str)
{
int l=strlen(str);
int i;
node *p=root;
for(i=0;i<l;i++)
{
int k=str[i]-32;
while(p->next[k]==0&&p!=root)
p=p->fail;
p=p->next[k]==0?root:p->next[k];
node *temp=p;
while(temp!=root)
{
if(temp->flag!=0)
hash[temp->flag]++;
temp=temp->fail;
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i;
root =new node;
memset(hash,0,sizeof(hash));
for(i=1;i<=n;i++)
{
scanf("%s",table[i]);
insert(table[i],i);
}
build_fail();
scanf("%s",str);
ac_find(str);
for(i=1;i<=n;i++)
{
if(hash[i]!=0)
{
printf("%s: %d\n",table[i],hash[i]);
}
}
de(root);
}
return 0;
}
hdu3065 AC自动机
最新推荐文章于 2019-07-24 09:24:46 发布