模板题 == 大水题!
#include "stdio.h"
#include "algorithm"
#include "iostream"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "vector"
#include "map"
#include "set"
#define ich(x) x-'a'
#define rep(f,a,b) for(f=a;f<=b;f++)
using namespace std;
const int N=205,T=1000005;
struct Trie{
Trie * go[26];
Trie * fail;
vector<Trie*> son;
Trie (); int sum;
} Tnull,*null=&Tnull;
Trie::Trie(){
for (int i=0;i<26;i++)
go[i]=null;
son.clear();
fail=null; sum=0;
}
Trie*v[T];
struct AC_Automaton{
Trie *root; int n;
vector <char> ch[N];
Trie **q; int l,r;
Trie *ans[N];
AC_Automaton(){
root=new Trie;
for (int i=0;i<26;i++){
null->go[i]=root;
}
}
void Build_Automaton(){
for (int i=1;i<=n;i++){
Trie *r=root;
for (int j=0,t=ich(ch[i][j]);j<ch[i].size();t=ich(ch[i][++j])){
if (r->go[t]==null)
r->go[t]=new Trie;
r=r->go[t]; r->sum++;
}
ans[i]=r;
}
#define up(x) (x==T-1?0:x+1)
l=1; q[r=1]=root;
while (l!=up(r)){
Trie *f=q[l]; l=up(l);
for (int i=0;i<26;i++){
if (f->go[i]!=null){
q[r=up(r)]=f->go[i];
Trie *t=f->fail;
while (t->go[i]==null)
t=t->fail;
Trie * tot=t->go[i];
f->go[i]->fail=tot;
tot->son.push_back(f->go[i]);
}
}
}
}
void dfs(Trie*r){
for (int i=0;i<r->son.size();i++){
dfs(r->son[i]);
r->sum+=r->son[i]->sum;
}
}
void Build_Failtree(){
dfs(root);
}
} ac;
char str[T];
int main(){
scanf("%d\n",&ac.n); int i,j,l; ac.q=v;
for (i=1;i<=ac.n;i++){
scanf("%s",str); l=strlen(str);
for (j=0;j<l;j++)
ac.ch[i].push_back(str[j]);
}
ac.Build_Automaton();
ac.Build_Failtree();
for (i=1;i<=ac.n;i++)
printf("%d\n",ac.ans[i]->sum);
return 0;
}