#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
const int LEN=2e6+10;
int n;
char s[MAXN],t[LEN];
int trie[MAXN][30],End[MAXN],cnt;
int fail[MAXN];
int edge[MAXN*2][2],head[MAXN],len;
int val[MAXN];
void insert(char s[],int len,int id)
{
int i,j,now=0;
for(i=1;i<=len;i++)
{
int c=s[i]-'a';
if(trie[now][c]==0)
trie[now][c]=++cnt;
now=trie[now][c];
}
End[id]=now;
}
void add(int x,int y)
{
len++;
edge[len][0]=x;
edge[len][1]=head[y];
head[y]=len;
}
queue<int> q;
void build()
{
int i,j;
for(i=0;i<26;i++)
if(trie[0][i]!=0)
q.push(trie[0][i]);
while(!q.empty())
{
int x=q.front(); q.pop();
for(i=0;i<26;i++)
{
if(trie[x][i]!=0)
{
fail[trie[x][i]]=trie[fail[x]][i];
q.push(trie[x][i]);
add(trie[x][i],trie[fail[x]][i]);
}
else
trie[x][i]=trie[fail[x]][i];
}
}
}
void query(int x)
{
int i,j;
for(i=head[x];i;i=edge[i][1])
{
query(edge[i][0]);
val[x]+=val[edge[i][0]];
}
}
int main()
{
int i,j,now=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s",s+1);
insert(s,strlen(s+1),i);
}
build();
scanf("%s",t+1);
int tmp=strlen(t+1);
for(i=1;i<=tmp;i++)
{
int c=t[i]-'a';
now=trie[now][c];
val[now]++;
}
query(1);
for(i=1;i<=n;i++)
printf("%d\n",val[End[i]]);
return 0;
}