和hdu2896类似,属于简单入门题。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
int ch[50005][26];
int fail[50005];
int v[1005];
char c[1005][50];
char d[2000005];
struct pi{
int cover;
int id;
}val[50005];
int tot;
queue<int >q;
int pan(char x){
if(x>='A'&&x<='Z') return 1;
return 0;
}
void init(){
int i;
for(i=0;i<=50005;i++) val[i].cover=0;
memset(ch,0,sizeof(ch));
memset(fail,0,sizeof(fail));
memset(v,0,sizeof(v));
}
void get_trie(int n){
int i,j,p,f;
tot=0;
for(i=0;i<n;i++){
p=strlen(c[i]);
f=0;
for(j=0;j<p;j++){
if(ch[f][c[i][j]-'A']) f=ch[f][c[i][j]-'A'];
else {
ch[f][c[i][j]-'A']=++tot;
f=tot;
}
}
val[f].cover=1;
val[f].id=i;
}
}
void get_fail(void){
int i,fa,p;
for(i=0;i<26;i++){
if(ch[0][i]) q.push(ch[0][i]);
}
while(!q.empty()){
p=q.front();
q.pop();
for(i=0;i<26;i++){
if(ch[p][i]){
q.push(ch[p][i]);
fa=fail[p];
while(fa&&!ch[fa][i]) fa=fail[fa];
fa=ch[fa][i];
fail[ch[p][i]]=fa;
}
}
}
}
void find(char *T){
int i,j,p,n;
n=strlen(T);
j=0;
for(i=0;i<n;i++){
if(!pan(T[i])) j=0;
else{
while(j&&!ch[j][T[i]-'A']) j=fail[j];
j=ch[j][T[i]-'A'];
p=j;
while(p){
if(val[p].cover) v[val[p].id]++;
p=fail[p];
}
}
}
}
int main()
{
int i,n;
while(scanf("%d",&n)!=EOF){
init();
getchar();
for(i=0;i<n;i++) gets(c[i]);
gets(d);
get_trie(n);
get_fail();
find(d);
for(i=0;i<n;i++){
if(v[i]) printf("%s: %d\n",c[i],v[i]);
}
}
}