1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long LL;
4 typedef unsigned long long ULL;
5 #define MAXN 26
6 #define L 31
7 #define INF 1000000009
8 #define eps 0.00000001
9 struct node
10 {
11 node()
12 {
13 cnt = 0;
14 fail = NULL;
15 for (int i = 0; i < MAXN; i++)
16 next[i] = NULL;
17 }
18 int cnt;
19 struct node* next[MAXN];
20 struct node* fail;
21 };
22 typedef struct node* Tree;
23 void insert(Tree T, const char* str)
24 {
25 int p = 0;
26 Tree tmp = T;
27 while (str[p] != '\0')
28 {
29 int k = str[p] - 'a';
30 if (tmp->next[k] == NULL)
31 {
32 tmp->next[k] = new node();
33 }
34 tmp = tmp->next[k];
35 p++;
36 }
37 tmp->cnt++;
38 }
39 void build_ac(Tree root)
40 {
41 root->fail = NULL;
42 queue<Tree> q;
43 q.push(root);
44 while (!q.empty())
45 {
46 Tree tmp = q.front();
47 q.pop();
48 Tree p = NULL;
49 for (int i = 0; i < MAXN; i++)
50 {
51 if (tmp->next[i] != NULL)
52 {
53 if (tmp == root)
54 tmp->next[i]->fail = root;
55 else
56 {
57 p = tmp->fail;
58 while (p != NULL)
59 {
60 if (p->next[i] != NULL)
61 {
62 tmp->next[i]->fail = p->next[i];
63 break;
64 }
65 p = p->fail;
66 }
67 if (p == NULL) tmp->next[i]->fail = root;
68 }
69 q.push(tmp->next[i]);
70 }
71 }
72 }
73 }
74 int query(Tree root,const char* str)
75 {
76 int i = 0;
77 int count = 0;
78 int l = strlen(str);
79 Tree tmp = root;
80 int index;
81 while (str[i])
82 {
83 index = str[i] - 'a';
84 while (tmp->next[index] == NULL && tmp != root)
85 tmp = tmp->fail;
86 tmp = tmp->next[index];
87 if (tmp == NULL) tmp = root;
88 Tree p = tmp;
89 while (p != root)
90 {
91 count += p->cnt;
92 p->cnt = 0;
93 p = p->fail;
94 }
95 i++;
96 }
97 return count;
98 }
99
100 void del(Tree root)
101 {
102 for (int i = 0; i < MAXN; i++)
103 if (root->next[i] != NULL)
104 del(root->next[i]);
105 delete root;
106 }
107 char key[60], s[1000010];
108 int main()
109 {
110 int T=1,n;
111 while (T--)
112 {
113 scanf("%d", &n);
114 Tree root = new node();
115 root->cnt = 0;
116 root->fail = NULL;
117 for (int i = 0; i < MAXN; i++)
118 root->next[i] = NULL;
119 for (int i = 0; i < n; i++)
120 {
121 scanf("%s", key);
122 insert(root, key);
123 }
124 build_ac(root);
125 scanf("%s", s);
126 printf("%d\n", query(root, s));
127 del(root);
128 }
129 }