fail树好厉害。
这题还是要按bfs序来。。。。一开始直接for (int i=tot;i>=1;i--)了。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxn 1000050 using namespace std; int n,son[maxn][27],fail[maxn],tot=0,val[maxn],sum[maxn],l[maxn],r[maxn],root,pos[250]; char s[maxn]; int q[maxn<<1],tail,head; void insert_AC(int x) { int now=root,l=strlen(s); for (int i=0;i<l;i++) { int nb=s[i]-'a'+1; if (!son[now][nb]) son[now][nb]=++tot; now=son[now][nb];val[now]++; } pos[x]=now; } void build_AC() { head=tail=1;q[1]=0; while (head<=tail) { int heads=q[head];head++; for (int i=1;i<=26;i++) { if (son[heads][i]) { if (!heads) fail[son[heads][i]]=0; else fail[son[heads][i]]=son[fail[heads]][i]; q[++tail]=son[heads][i]; } else son[heads][i]=son[fail[heads]][i]; } } for (int i=tail;i>=1;i--) val[fail[q[i]]]+=val[q[i]]; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%s",s); insert_AC(i); } build_AC(); for (int i=1;i<=n;i++) printf("%d\n",val[pos[i]]); return 0; }