bzoj 3172: [Tjoi2013]单词

时间:2021-09-29 18:16:08
 #include<cstdio>
#include<cstring>
#include<iostream>
#define M 1000008
using namespace std;
char ch[M];
int a[M][],n,cnt=,fa[M],f1[M],ans[M],q[M];
long long sum[M],aa;
void jia()
{
int now=;
for(int i=;i<=strlen(ch+);i++)
if(!a[now][ch[i]-])
{
cnt++;
a[now][ch[i]-]=cnt;
sum[cnt]++;
now=cnt;
}
else
{
now=a[now][ch[i]-];
sum[now]++;
}
ans[]++;
ans[ans[]]=now;
}
void build()
{
int h=,t=;
q[]=;
for(;h<t;)
{
int p=q[++h];
for(int i=;i<=;i++)
if(a[p][i])
{
int now=fa[p];
q[++t]=a[p][i];
for(;!a[now][i];now=fa[now]);
fa[a[p][i]]=a[now][i];
}
}
return;
}
void dfs(int a1)
{
f1[a1]=;
int now;
for( now=fa[a1];f1[now]&&now>;sum[now]+=sum[a1],now=fa[now]);
sum[now]+=sum[a1];
for(int i=;i<=;i++)
if(a[a1][i])
dfs(a[a1][i]);
return;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",ch+);
jia();
}
for(int i=;i<=;i++)
a[][i]=;
build();
dfs();
for(int i=;i<=n;i++)
printf("%lld\n",sum[ans[i]]);
return ;
}

AC自动机