1 #include <cstdio>
2 #include <cstring>
3 #include <cstdlib>
4 #include <iostream>
5
6 using namespace std;
7
8 const int N = 205;
9 const int L = 10005;
10 const int M = 100010;
11
12 int ans[5];
13 char pat[N], str[L];
14 struct node {
15 int n;
16 node *prefix;
17 node *child[128];
18 node() {
19 n = 0;
20 prefix = NULL;
21 for (int i=0; i<128; ++i) child[i] = NULL;
22 }
23 }*root, *Q[M];
24 int front, rear;
25
26 int cmp(const void *a, const void *b) {
27 return *(int *)a - *(int *)b;
28 }
29
30 void insert(char pat[], int n) {
31 node *p = root;
32 for (int k,i=0; pat[i]; ++i, p=p->child[k]) {
33 k = (int)pat[i];
34 if (!p->child[k]) p->child[k] = new node();
35 }
36 p->n = n;
37 }
38
39 void buildAc(node *root) {
40 node *p, *q;
41 root->prefix = NULL;
42 front = rear = 0;
43 Q[front++] = root;
44 while (rear < front) {
45 p = Q[rear++];
46 for (int i=0; i<128; ++i) {
47 if (p->child[i]) {
48 if (p == root) p->child[i]->prefix = root;
49 else {
50 q = p->prefix;
51 while (q!=root && !q->child[i]) q = q->prefix;
52 if (q->child[i]) p->child[i]->prefix = q->child[i];
53 else p->child[i]->prefix = root;
54 }
55 Q[front++] = p->child[i];
56 }
57 }
58 }
59 }
60
61 int match(node *root, char str[]) {
62 node *p = root;
63 int cnt = 0;
64 for (int k,i=0; str[i]; ++i) {
65 k = (int)str[i];
66 while (p!=root && !p->child[k]) p = p->prefix;
67 p = p->child[k];
68 if (!p) p = root;
69 node *tmp = p;
70 while (tmp!=root && tmp->n) {
71 ans[cnt++] = tmp->n;
72 tmp = tmp->prefix;
73 }
74 }
75 return cnt;
76 }
77
78 void del(node *p) {
79 if (!p) return ;
80 for (int i=0; i<128; ++i) {
81 if (p->child[i]) del(p->child[i]);
82 }
83 delete p;
84 p = NULL;
85 }
86
87 int main() {
88 int n, cs, ss;
89 while (scanf("%d", &n) != EOF) {
90 ss = 0;
91 root = new node();
92 for (int i=1; i<=n; ++i) scanf("%s", pat), insert(pat, i);
93 buildAc(root);
94 scanf ("%d", &n);
95 for (int i=1; i<=n; ++i) {
96 scanf ("%s", str);
97 if (cs = match(root, str)) {
98 qsort(ans, cs, sizeof(int), cmp);
99 printf ("web %d:", i);
100 for (int i=0; i<cs; ++i) printf (" %d", ans[i]);
101 puts("");
102 ++ss;
103 }
104 }
105 printf ("total: %d\n", ss);
106 del(root);
107 }
108 return 0;
109 }