#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#define re register int
#define il inline
using namespace std;
il int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
const int N=2e6+5,M=2e5+5;
int n,ch[M][26],cnt=1,fail[N],nxt[M],head[M],tot,go[M],sz[M],pos[M];
char s[N];
il void insert(int id)
{
scanf("%s",s+1);
int u=1,len=strlen(s+1);
for(re i=1;i<=len;i++)
{
int x=s[i]-'a';
if(!ch[u][x])ch[u][x]=++cnt;
u=ch[u][x];
}
pos[id]=u;
}
il void get_fail()
{
queue<int>q;
//for(re i=0;i<26;i++)if(ch[1][i])fail[ch[1][i]]=1,q.push(ch[1][i]);//用这个92分
q.push(1);for(re i=0;i<26;i++)ch[0][i]=1;//这个100分
while(!q.empty())
{
int u=q.front();q.pop();
for(re i=0;i<26;i++)
if(ch[u][i])fail[ch[u][i]]=ch[fail[u]][i],q.push(ch[u][i]);
else ch[u][i]=ch[fail[u]][i];
}
}
il void change()
{
scanf("%s",s+1);
int u=1,len=strlen(s+1);
for(re i=1;i<=len;i++)
u=ch[u][s[i]-'a'],sz[u]++;
}
il void Add(int x,int y)
{
nxt[++tot]=head[x];
head[x]=tot;go[tot]=y;
}
il void dfs(int x)
{
for(re i=head[x],y;i,y=go[i];i=nxt[i])
dfs(y),sz[x]+=sz[y];
}
signed main()
{
n=read();
for(re i=1;i<=n;i++)insert(i);
get_fail();change();
for(re i=2;i<=cnt;i++)Add(fail[i],i);
dfs(1);
for(re i=1;i<=n;i++)printf("%d\n",sz[pos[i]]);
return 0;
}
代码中有个注释的地方,用上面的92分,用下面的100分,有谁知道上面的写法有什么问题吗