#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rop(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define por(i,a,b) for(int i=a;i>b;i--)
#define endl '\n'
#define pii pair<int,int>
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef double lf;
typedef long double ld;
using namespace std;
int n,cnt,rev[10000005],indeg[10000005],ans,vis[10000005],tot;
char s[100005],s1[1000005];
struct node{
int fail,ans,son[27],flag;
void init(){
memset(son,0,sizeof(son));
fail=flag=0;
}
}trie[8000005];
queue<int>q;
void insert(char*s,int num){
int u=1,len=strlen(s);
rop(i,0,len){
int to=s[i]-97;
if(!trie[u].son[to])
trie[u].son[to]=++cnt;
u=trie[u].son[to];
}
if(!trie[u].flag)
trie[u].flag=num;
rev[num]=trie[u].flag;
}
void getfail(){
rop(i,0,27)
trie[0].son[i]=1;
q.push(1);
trie[1].fail=0;
while(q.size()){
int u=q.front();
q.pop();
int fail=trie[u].fail;
rop(i,0,27){
int to=trie[u].son[i];
if(!to){
trie[u].son[i]=trie[fail].son[i];
continue;
}
trie[to].fail=trie[fail].son[i];
indeg[trie[fail].son[i]]++;
q.push(to);
}
}
}
void topu(){
rep(i,1,cnt)
if(!indeg[i])
q.push(i);
while(q.size()){
int fr=q.front();
q.pop();
vis[trie[fr].flag]=trie[fr].ans;
int u=trie[fr].fail;
trie[u].ans+=trie[fr].ans;
if((--indeg[u])==0)
q.push(u);
}
}
void query(char*s){
int u=1,len=strlen(s);
rop(i,0,len){
u=trie[u].son[s[i]-97];
trie[u].ans++;
}
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
rep(i,0,cnt)
trie[i].init();
rep(i,1,n)
vis[i]=0;
cnt=1;
ans=0;
rep(i,1,n){
cin>>s;
rop(j,0,strlen(s))
s1[tot++]=s[j];
s1[tot++]='{';
insert(s,i);
}
getfail();
query(s1);
topu();
rep(i,1,n)
cout<<vis[rev[i]]<<endl;
return 0;
}
https://www.luogu.com.cn/record/167636279