#include<bits/stdc++.h>
using namespace std;
string c,t;
int n,tot,len,in[200005];
struct ACC{
int ch[26];
int fail;
int end;
}AC[200005];
struct node{
int cnt,pos;
bool operator < (const node&hhh) const {
if(cnt!=hhh.cnt)
return cnt>hhh.cnt;
return pos<hhh.pos;
}
}f[200005];
void getfail(){
queue <int> q;
for(int i=0;i<26;++i){
if(AC[0].ch[i]){
AC[AC[0].ch[i]].fail=0;
in[0]++;
q.push(AC[0].ch[i]);
}
}
while(!q.empty()){
int r=q.front();q.pop();
for(int i=0;i<26;++i){
if(AC[r].ch[i]){
AC[AC[r].ch[i]].fail=AC[AC[r].fail].ch[i];
++in[AC[AC[r].fail].ch[i]];
q.push(AC[r].ch[i]);
}
else{
AC[r].ch[i]=AC[AC[r].fail].ch[i];
}
}
}
}
void toAC(){
len=t.size();
int p=0;
for(int i=0;i<len;++i){
p=AC[p].ch[t[i]-'a'];
++f[AC[p].end].cnt;
}
}
void topu(){
queue<int> q;
for(int i=1;i<=tot;++i)
if(!in[i])
q.push(i);
while(!q.empty()){
int r=q.front();q.pop();
int vv=AC[r].fail;
f[AC[vv].end].cnt+=f[AC[r].end].cnt;
if(--in[vv]==0)
q.push(vv);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>c;
int len=c.size();
int p=0;
for(int j=0;j<len;++j){
if(!AC[p].ch[c[j]-'a'])
AC[p].ch[c[j]-'a']=++tot;
p=AC[p].ch[c[j]-'a'];
}
if(!AC[p].end)
AC[p].end=i,f[i].pos=i;
else
f[i].pos=AC[p].end;
}
cin>>t;
getfail();
toAC();
topu();
for(int i=1;i<=n;++i)
cout<<f[f[i].pos].cnt<<'\n';
return 0;
}