#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct Suffix_Automaton{
int link[N],trans[N][26],cnt,last,len[N],vis[N],ans[N];
Suffix_Automaton(){cnt=1;}
inline int insert(int ch){
if (trans[last][ch]){
int y=trans[last][ch],p=last;
if (len[p]+1==len[y]) return y;
int z=++cnt;len[z]=len[p]+1;
link[z]=link[y],link[y]=z;
for (;p&&trans[p][ch]==y;p=link[p]) trans[p][ch]=z;
return z;
}
int p=last,x=++cnt;len[x]=len[p]+1;
for(;p&&!trans[p][ch];p=link[p]) trans[p][ch]=x;
if (!p) link[x]=1;
else{
int y=trans[p][ch];
if (len[y]==len[p]+1) link[x]=y;
else{
int z=++cnt;len[z]=len[p]+1;
for (int i=0;i<26;i++) trans[z][i]=trans[y][i];
link[z]=link[y],link[y]=link[x]=z;
for (;p&&trans[p][ch]==y;p=link[p]) trans[p][ch]=z;
}
}
return x;
}
inline void getans(int n){
for (int i=2;i<=cnt;i++){
if (!vis[i]) continue;
ans[vis[i]]+=len[i]-len[link[i]];
}
for (int i=1;i<=n;i++) printf("%d\n",ans[i]);
}
}sam;
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;cin>>n;
for (int i=1;i<=n;i++){
string s;cin>>s;
sam.last=1;
for (size_t j=0;j<s.size();j++){
sam.last=sam.insert(s[j]-'a');
int p=sam.last;
for (;p>1;p=sam.link[p]){
if (sam.vis[p]==-1) continue;
if (sam.vis[p]==0) sam.vis[p]=i;
else if(sam.vis[p]!=i) sam.vis[p]=-1;
}
}
}
sam.getans(n);
return 0;
}
在发之前我有双层玄幻两层都是iqaq