码丑勿喷
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int s[2100000],n,u,len,tot,a[21000],b[21000];
char s1[2100][210];
queue<int> q;
struct node
{
int a[30],last,fail,s;
}ch[1100000];
void BFS()
{
for(int i=0;i<=25;i++)
if(ch[0].a[i])
q.push(ch[0].a[i]);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<=25;i++)
{
int y=ch[x].a[i];
if(y)
{
int p=ch[ch[x].fail].a[i];
ch[y].fail=p;
q.push(y);
}
else
ch[x].a[i]=ch[ch[x].fail].a[i];
}
}
}
int main()
{
scanf("%d",&n);
memset(ch,0,sizeof(ch));
tot=len=0;
for(int i=1;i<=n;i++)
{
int l;
scanf("%s",s1[i]+1);
l=strlen(s1[i]+1);
u=0;
for(int j=1;j<=l;j++)
{
s[j+len]=s1[i][j];
int x=s1[i][j]-'a';
if(!ch[u].a[x])
{
tot++;
ch[u].a[x]=tot;
}
u=ch[u].a[x];
}
ch[u].s++;
a[i]=u;
len+=l;
len++;
s[len]='#';
}
BFS();
u=0;
for(int i=1;i<=len;i++)
{
u=ch[u].a[s[i]-'a'];
int x=u;
while(x)
{
b[x]+=ch[x].s;
x=ch[x].fail;
}
}
for(int i=1;i<=n;i++)
printf("%d\n",b[a[i]]);
return 0;
}