int tr[N][26],ne[N],tot,cnt[N]; int q[N]; char str[M];
voidinsert() { int u=0; for (int i=0;str[i];++i) { int t=str[i]-'a'; if (!tr[u][t]) tr[u][t]=++tot; u=tr[u][t]; } cnt[u]++; }
voidbuild() { int hh=0,tt=-1; for (int i=0;i<26;++i) if (tr[0][i]) q[++tt]=tr[0][i]; while (hh<=tt) { int x=q[hh++]; for (int h=0;h<26;++h) { int &t=tr[x][h]; if (!t) t=tr[ne[x]][h]; else{ ne[t]=tr[ne[x]][h]; q[++tt]=t; } } } }
intCalcans() { int ans=0; for (int i=0,j=0;str[i];++i) { int t=str[i]-'a'; j=tr[j][t]; int p=j; while (p&&~cnt[p]) { ans+=cnt[p]; cnt[p]=-1; p=ne[p]; } } return ans; }
intmain() { int n; cin>>n; while (n--) { scanf("%s",str); insert(); } build(); scanf("%s",str); printf("%d\n",Calcans()); return0; }
constint N=1e6+10; int tr[N][26],ne[N],cnt[N],id[250],tot,q[N],hh,tt=-1,n; char str[N];
voidinsert(int x) { int u=0; for (int i=0;str[i];i++) { int t=str[i]-'a'; if (!tr[u][t]) tr[u][t]=++tot; u=tr[u][t]; cnt[u]++; } id[x]=u; }
voidbuild() { for (int i=0;i<26;++i) if (tr[0][i]) q[++tt]=tr[0][i]; while (hh<=tt) { int x=q[hh++]; for (int i=0;i<26;++i) { int &t=tr[x][i]; if (!t) t=tr[ne[x]][i]; else{ ne[t]=tr[ne[x]][i]; q[++tt]=t; } } } }
intmain() { cin>>n; for (int i=1;i<=n;++i) { scanf("%s",str); insert(i); } build(); for (int i=tt;i>=0;--i) cnt[ne[q[i]]]+=cnt[q[i]]; for (int i=1;i<=n;++i) printf("%d\n",cnt[id[i]]); return0; }