题目链接
这道题与hdu2222类似
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<new>
#include<queue>
#include<string.h>
#include<map>
#include<set>
using namespace std;
const int sz=2500000;
map<int,int>mp;
char s[sz],s1[1200][60];
int cnt[1200];
struct node
{
node *Next[26];
node *fail;
int key,sum;//key记录属于哪一类。
};
node *root;
queue<node *>q;
void init()
{
root=new node();
for(int i=0;i<26;i++)
root->Next[i]=NULL;
root->fail=NULL;
root->key=0;
root->sum=0;
memset(cnt,0,sizeof(cnt));
}
void update(char cc[],int k)
{
int go,i,len;
len=strlen(cc);
node *new_node,*now;
now=root;
for(i=0;i<len;i++)
{
go=cc[i]-'A';
if(now->Next[go]==NULL)
{
new_node=new node();
for(int j=0;j<26;j++)
new_node->Next[j]=NULL;
new_node->fail=NULL;
new_node->key=0;
new_node->sum=0;
now->Next[go]=new_node;
}
now=now->Next[go];
}
now->sum++;
now->key=k;
}
void make_fail()
{
node *temp,*p;
q.push(root);
while(!q.empty())
{
temp=q.front();
q.pop();
for(int i=0;i<26;i++)
{
if(temp->Next[i]!=NULL)
{
if(temp==root)
temp->Next[i]->fail=root;
else
{
p=temp->fail;
while(p!=NULL)
{
if(p->Next[i]!=NULL)
{
temp->Next[i]->fail=p->Next[i];
break;
}
p=p->fail;
}
if(p==NULL)
temp->Next[i]->fail=NULL;
}
q.push(temp->Next[i]);
}
}
}
}
void query(char cc[])
{
int len,i,go;
node *temp,*p;
temp=root;
len=strlen(cc);
for(i=0;i<len;i++)
{
if(cc[i]<'A'||cc[i]>'Z')
{
temp=root;
continue;
}
go=s[i]-'A';
while(temp!=root&&temp->Next[go]==NULL)temp=temp->fail;
temp=temp->Next[go];
if(temp==NULL)
temp=root;
p=temp;
while(p!=root)
{
if(p->sum!=0)cnt[p->key]++;
p=p->fail;
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i;
init();
for(i=1;i<=n;i++)
{
scanf("%s",s1[i]);
update(s1[i],i);
}
make_fail();
scanf("%s",s);
query(s);
for(i=1;i<=n;i++)
{
if(cnt[i]!=0)
{
printf("%s: %d\n",s1[i],cnt[i]);
}
}
}
return 0;
}