#include <iostream>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
const int N = 2e6+10;
int final[N],tire[N][26],fail[N],times[N],cnt;
int e[N],ne[N],h[N],idx;
int box[N];
void addEdge(int a,int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
void Insert(int q,string& s){
int p = 0;
for(int i = 0; i < s.size(); i++){
int x = s[i] - 'a';
if(!tire[p][x])tire[p][x] = ++cnt;
p = tire[p][x];
}
final[q] = p;
}
void setFail(){
int l = 0, r = -1;
for(int i = 0; i < 26; i++){
if(tire[0][i])box[++r] = tire[0][i];
}
while(l <=r ) {
int u = box[l++];
for (int i = 0; i < 26; i++) {
if (tire[u][i]) {
fail[tire[u][i]] = tire[fail[u]][i];
box[++r] = tire[u][i];
} else {
tire[u][i] = tire[fail[u]][i];
}
}
}
}
void dfs(int u,int fa){
if(u == fa)return;
for(int i = h[u]; i != -1;i = ne[i]){
dfs(e[i],u);
times[u] += times[e[i]];
}
}
int main(){
int n;
cin >> n;
for(int i = 0;i < n; i++){
string t;
cin >> t;
Insert(i,t);
}
setFail();
string article;
cin >> article;
for(int i = 0,u = 0; i < article.size(); i++){
u = tire[u][article[i] - 'a'];
times[u]++;
}
memset(h,-1,sizeof h);
for(int i = 0; i <= cnt; i++){
addEdge(fail[i],i);
}
dfs(0,-1);
for(int i = 0; i < cnt; i++){
if(final[i])printf("%d\n",times[final[i]]);
}
return 0;
}