#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 210
#define M 1000100
using namespace std;
int n,L,root,size;
char s[N][M];
int next[M][27],fail[M],end[M],q[M];
int newnode()
{
for(int i=1;i<=26;i++)next[size][i]=-1;
end[size++]=0;
return size-1;
}
void init()
{
size=0;
root=newnode();
}
void ins()
{
int l=strlen(s[L]);
int now=root;
for(int i=0;i<l;i++)
{
int tmp=s[L][i]-‘a‘+1;
if(next[now][tmp]==-1)next[now][tmp]=newnode();
now=next[now][tmp];
end[now]++;
}
}
void build()
{
int LL=0,RR=-1;
for(int i=1;i<=26;i++)
{
if(next[root][i]==-1)next[root][i]=root;
else
{
fail[next[root][i]]=root;
q[++RR]=next[root][i];
}
}
while(LL<=RR)
{
int u=q[LL++];
for(int i=1;i<=26;i++)
{
if(next[u][i]==-1)next[u][i]=next[fail[u]][i];
else
{
fail[next[u][i]]=next[fail[u]][i];
q[++RR]=next[u][i];
}
}
}
for(int i=RR;i>=0;i--)
{
end[fail[q[i]]]+=end[q[i]];
}
}
int main()
{
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]);
L++;
ins();
}
build();
L=1;
for(int i=1;i<=n;i++)
{
int k=root;
int l=strlen(s[i]);
for(int j=0;j<l;j++)k=next[k][s[i][j]-‘a‘+1];
printf("%d\n",end[k]);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
BZOJ 3172 [Tjoi2013]单词 AC自动机(fail树)
原文地址:http://blog.csdn.net/wzq_qwq/article/details/46803047