这题用的是AC自动机做的,没听说过的自己去百度看看,这题唯一要注意的就是最后输入的字符串当中会出现不是26个大写字母当中的字符。
/*
time 156MS
mem 7444K
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define maxn 26
#define maxc 2000005
#define mem(a) memset(a, 0, sizeof(a))
using namespace std;
int head, tail, ans[1005], res[1005];
char ch[1005][55], cha[maxc];
struct node
{
int v;
int num;
struct node *next[maxn];
struct node *fail;
};
node *q[100000], *root;
void buildinit(struct node *a)
{
int i;
a->v = 0;
a->num = 0;
a->fail = NULL;
for(i = 0;i < 26;i++)
a->next[i] = NULL;
return;
}
void build(char *word, struct node *root, int num)
{
int i = 0, len, a;
struct node *tmp;
tmp = root;
len = strlen(word);
for(i = 0;i < len;i++)
{
a = ch[num - 1][i] - 'A';
if(tmp->next[a] == NULL)
{
tmp->next[a] = (struct node*)malloc(sizeof(struct node));
buildinit(tmp->next[a]);
if(i == (len - 1))
tmp->next[a]->v = 1, tmp->next[a]->num = num;
tmp = tmp->next[a];
}
else
{
if(i == (len - 1))
tmp->next[a]->v = 1, tmp->next[a]->num = num;
tmp = tmp->next[a];
}
}
return;
}
void ac_machine_build(struct node *root)
{
int i;
head = 0;
tail = 1;
q[head] = root;
struct node *tmp, *p;
while(head < tail)
{
tmp = q[head++];
head %= 100000;
for(i = 0;i < 26;i++)
{
if(tmp->next[i])
{
if(tmp == root)
{
tmp->next[i]->fail = root;
}
else
{
p = tmp->fail;
while(p)
{
if(p->next[i])
{
tmp->next[i]->fail = p->next[i];
break;
}
p = p->fail;
}
if(!p)
tmp->next[i]->fail = root;
}
q[tail++] = tmp->next[i];
tail %= 100000;
}
}
}
return;
}
void que(struct node *root)
{
int len, a, i;
len = strlen(cha);
struct node *p;
p = root;
for(i = 0;i < len;i++)
{
a = cha[i] - 'A';
if((a < 0)||(a > 25))
{
p = root;
continue;
}
while(!p->next[a]&&p != root)
p = p->fail;
p = p->next[a];
if(!p)
p = root;
struct node *tmp = p;
while(tmp != root)
{
if(tmp->v > 0)
{
if(!res[tmp->num])
ans[++ans[0]] = tmp->num;
res[tmp->num]++;
}
tmp = tmp->fail;
}
}
return;
}
void deal(struct node *q)
{
int i;
if(q)
{
for(i = 0;i < 26;i++)
{
if(q->next[i])
deal(q->next[i]);
}
free(q);
}
return;
}
int main(int argc, char *argv[])
{
int num, i, j;
while(scanf("%d", &num) != EOF)
{
mem(ch);
mem(ans);
mem(res);
root = (struct node*)malloc(sizeof(struct node));
buildinit(root);
for(i = 0;i < num;i++)
{
scanf("%s", ch[i]);
build(ch[i], root, i + 1);
}
ac_machine_build(root);
mem(cha);
scanf("%s", cha);
que(root);
sort(ans + 1, ans + 1 + ans[0]);
for(i = 1;i <= ans[0];i++)
{
printf("%s: %d\n", ch[ans[i] - 1], res[ans[i]]);
}
deal(root);
}
return 0;
}