1 #include <cstdio>
2 #include <cstring>
3 #include <cstdlib>
4 #include <algorithm>
5 #include <iostream>
6 #include <string>
7 #include <queue>
8 using namespace std;
9 const int N=510000;
10 struct Tri
11 {
12 int Next[N][26], fail[N], val[N], root, L;
13 void init() {L = 0;root = newnode();}
14 int newnode()
15 {
16 for(int i = 0;i < 26;i++) Next[L][i] = -1;
17 val[L++] = 0;
18 return L - 1;
19 }
20
21 void insert(char s[])
22 {
23 int len = strlen(s), cur = root;
24 for(int i = 0;i < len;i++)
25 {
26 if(Next[cur][s[i]-'a'] == -1)
27 Next[cur][s[i]-'a'] = newnode();
28 cur = Next[cur][s[i]-'a'];
29 }
30 val[cur]++;
31 }
32 void build()
33 {
34 queue<int>Q;
35 fail[root] = root;
36 for(int i = 0;i < 26;i++)
37 if(Next[root][i] == -1) Next[root][i] = root;
38 else
39 {
40 fail[Next[root][i]] = root;
41 Q.push(Next[root][i]);
42 }
43 while(!Q.empty())
44 {
45 int cur = Q.front(); Q.pop();
46 for(int i = 0;i < 26;i++)
47 if(Next[cur][i] == -1)
48 Next[cur][i] = Next[fail[cur]][i];
49 else
50 {
51 fail[Next[cur][i]]=Next[fail[cur]][i];
52 Q.push(Next[cur][i]);
53 }
54 }
55 }
56 int query(char s[])
57 {
58 int len = strlen(s), cur = root, res = 0;
59 for(int i = 0;i < len;i++)
60 {
61 cur = Next[cur][s[i]-'a'];
62 int tmp = cur;
63 while (tmp != root)
64 {
65 res += val[tmp];
66 val[tmp] = 0;
67 tmp = fail[tmp];
68 }
69 }
70 return res;
71 }
72 };
73 char s[N];
74 Tri AC;
75 int n;
76 int main()
77 {
78 scanf("%d",&n);
79 AC.init();
80 for(int i = 0;i < n;i++)
81 {
82 scanf("%s",s);
83 AC.insert(s);
84 }
85 AC.build();
86 scanf("%s",s);
87 printf("%d\n",AC.query(s));
88 return 0;
89 }