求助
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
string s[210];
int read()
{
int w=1,f=0;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
w=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
f=f*10+c-'0';
c=getchar();
}
return w*f;
}
struct Tree
{
int vis[27];
int fail;
int end;
}tree[1000000];
int n,cnt;
int ans[1000000];
void build(string s,int num)
{
int l=s.length();
int now=0;
for(int i=0;i<l;i++)
{
if(tree[now].vis[s[i]-'a']==0)
tree[now].vis[s[i]-'a']=++cnt;
now=tree[now].vis[s[i]-'a'];
}
tree[now].end=num;
}
void Get_Fail()
{
queue<int> Q;
for(int i=0;i<26;i++)
{
if(tree[0].vis[i]!=0)
{
tree[tree[0].vis[i]].fail=0;
Q.push(tree[0].vis[i]);
}
}
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=0;i<=26;i++)
{
if(tree[u].vis[i]!=0)
{
tree[tree[u].vis[i]].fail=tree[tree[u].fail].vis[i];
Q.push(tree[u].vis[i]);
}
else
tree[u].vis[i]=tree[tree[u].fail].vis[i];
}
}
}
void query(string s)
{
int l=s.length();
int now=0;
for(int i=0;i<l;i++)
{
now=tree[now].vis[s[i]-'a'];
for(int t=now;t;t=tree[t].fail)
ans[tree[t].end]++;
}
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
cin>>s[i];
build(s[i],i);
}
tree[0].fail=0;
Get_Fail();
for(int i=1;i<=n;i++)
query(s[i]);
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
return 0;
}