#include<bits/stdc++.h>
using namespace std;
int n,trie[2000001][27],fail[2000001],flag[2000001],rev[2000001],cnt,vis[2000001],ins[2000001],l,maxn,ans[200001];
string s[200001],t;
void insert(string s,int now){
int u=0;
for(int i=0;i<s.size();i++){
int c=s[i]-'a';
if(!trie[u][c]) trie[u][c]=++cnt;
u=trie[u][c];
}
if(!vis[u]) vis[u]=now;
rev[now]=vis[u];
}
void getfail(){
queue<int>q;
for(int i=0;i<26;i++){
if(trie[0][i]) q.push(trie[0][i]);
}
while(q.size()){
int u=q.front();
q.pop();
for(int i=0;i<26;i++){
if(trie[u][i]){
fail[trie[u][i]]=trie[fail[u]][i];
q.push(trie[u][i]);
ins[trie[fail[u]][i]]++;
}
else trie[u][i]=trie[fail[u]][i];
}
}
}
void query(string t){
int u=0;
for(int i=0;i<t.size();i++){
u=trie[u][t[i]-'a'];
ans[u]++;
}
}
void topu(){
queue<int>q;
for(int i=1;i<=cnt;i++){
if(!ins[i]) q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();
flag[vis[u]]=ans[u];
int v=fail[u];
ans[v]+=ans[u];
if(!(--ins[v])) q.push(v);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i];
insert(s[i],i);
t+=s[i];
t+=(char)('z'+1);
}
getfail();
query(t);
topu();
for(int i=1;i<=n;i++) cout<<flag[rev[i]]<<endl;
}