#include<iostream>
#include<queue>
#include<algorithm>
#include<numeric>
#include<map>
#include<functional>
#include<cmath>
#include<random>
using namespace std;
mt19937 rnd(time(0));
constexpr auto INF = 11451419;
constexpr long long MOD = 1e9 + 7;
constexpr long long PRI = 233317;
constexpr auto MAXN = 1000010;
constexpr auto MINS = 100010;
#define ll long long
#define ull unsigned long long
#define i64 long long
int cnt;
vector<int> bak[MAXN];
int nxt[MAXN][27];
int fail[MAXN];
int vis[MAXN];
int ans[MAXN];
vector<int> tree[MAXN];
void trie(const string& s, int i){
int p = 0;
for (auto it : s){
if (nxt[p][it - 'a' + 1] == 0)nxt[p][it - 'a' + 1] = ++cnt;
p = nxt[p][it - 'a' + 1];
}
bak[p].push_back(i);
}
void ac(){
queue<int> q;
for (int i = 1;i <= 26;i++){
if (nxt[0][i])q.push(nxt[0][i]);
}
while (q.size()){
int p = q.front();q.pop();
for (int i = 1;i <= 26;i++){
if (nxt[p][i]){
fail[nxt[p][i]] = nxt[fail[p]][i];
q.push(nxt[p][i]);
} else{
nxt[p][i] = nxt[fail[p]][i];
}
}
}
}
void dfs(int p){
for (auto it : tree[p]){
dfs(it);
vis[p] += vis[it];
}
for (auto it : bak[p]){
ans[it] += vis[p];
}
}
void solve(){
int n;cin >> n;
for (int i = 1;i <= n;i++){
string s;cin >> s;
trie(s, i);
}
ac();
int p = 0;
string str;cin >> str;
for (auto it : str){
p = nxt[p][it - 'a' + 1];
vis[p]++;
}
for (int i = 1;i <= cnt;i++)tree[fail[i]].push_back(i);
dfs(0);
for (int i = 1;i <= n;i++)cout << ans[i] << endl;
}
int main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int n = 1;//cin >> n;
while (n--){
solve();
}
return 0;
}