又是一道模板题。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int n,ch[52000][26],val[52000],fail[52000],tot,root,ans;
int solve[1001];
char tt[1001][52],sorce[2000002],fea[52];
queue<int>q;
int newnode()
{
memset(ch[tot],0,sizeof(ch[tot]));
val[tot]=0;
return tot++;
}
void update(char *a,int no)
{
int i,len=strlen(a),cur=root;
for(i=0;i<len;i++)
{
if(!ch[cur][a[i]-'A'])
ch[cur][a[i]-'A']=newnode();
cur=ch[cur][a[i]-'A'];
}
val[cur]=no;
strcpy(tt[no],a);
}
void getfail()
{
fail[root]=root;
for(int i=0;i<26;i++)
if(ch[root][i])
{
fail[ch[root][i]]=root;
q.push(ch[root][i]);
}
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int i=0;i<26;i++)
if(!ch[cur][i])
ch[cur][i]=ch[fail[cur]][i];
else
{
fail[ch[cur][i]]=ch[fail[cur]][i];
q.push(ch[cur][i]);
}
}
}
void query()
{
int cur=root,i,len=strlen(sorce);
for(i=0;i<len;i++)
{
if(sorce[i]>='A'&&sorce[i]<='Z')
{
cur=ch[cur][sorce[i]-'A'];
}
else cur=root;
int temp=cur;
while(temp!=root&&val[temp])
{
solve[val[temp]]++;
temp=fail[temp];
}
}
for(i=1;i<=n;i++)
if(solve[i])
{
printf("%s: %d\n",tt[i],solve[i]);
}
}
int main()
{
while(~scanf("%d",&n))
{
int i,j,k;
tot=0;
root=newnode();
memset(solve,0,sizeof(solve));
for(i=1;i<=n;i++)
{
scanf("%s",&fea);
update(fea,i);
}
getchar();
getfail();
gets(sorce);
query();
}
return 0;
}