rt
#include<bits/stdc++.h>
using namespace std;
string s;
struct node{
int fail;
int vis[30];
}tree[200100];
int he[200100],hao[200010];
int to[200010],Next[200010];
int head[200010];
int cnt=0,cntt=0;
void add(int x,int y)
{
to[cntt]=y;
Next[cntt]=head[x];
head[x]=cntt++;
}
void build(string s,int x)
{
int len=s.size();
int now=0;
for(int i=0;i<len;i++)
{
if(tree[now].vis[s[i]-'a']==0)tree[now].vis[s[i]-'a']=++cnt;
now=tree[now].vis[s[i]-'a'];
}
hao[x]=now;
}
void zhi()
{
queue<int>q;
for(int i=0;i<26;i++)
{
if(tree[0].vis[i]!=0)
{
tree[tree[0].vis[i]].fail=0;//hui geng
q.push(tree[0].vis[i]);
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<26;i++)
{
if(tree[u].vis[i]!=0)
{
tree[tree[u].vis[i]].fail=tree[tree[u].fail].vis[i];
q.push(tree[u].vis[i]);
}
else tree[u].vis[i]=tree[tree[u].fail].vis[i];
}
}
}
void dfs(int x)
{
for(int i=head[x];i!=-1;i=Next[i])
{
int v=to[i];
dfs(v);
he[x]+=he[v];
}
}
void init()
{
cnt=0,cntt=0;
memset(head,-1,sizeof(head));
memset(he,0,sizeof(he));
}
int main()
{
int n;
scanf("%d",&n);
init();
for(int i=1;i<=n;i++){cin>>s;build(s,i);}
tree[0].fail=0;
zhi();
getline(cin,s);
getline(cin,s);
int len=s.size();
int u=0;
for(int i=0;i<len;i++)
{
u=tree[u].vis[s[i]-'a'];
++he[u];
}
for(int i=1;i<=cnt;i++)add(tree[i].fail,i);
dfs(0);
for(int i=1;i<=n;i++){printf("%d\n",he[hao[i]]);}
return 0;
}