题目来源:http://codevs.cn/problem/2542/
还我BZOJ!还我BZOJ!还我BZOJ!
这题是AC自动机模板题
AC自动机模板:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
const int N=1000100;
int pos[N],n;
struct AC {
int A[N][26],sum[N],fail[N],cnt;
queue<int> q; stack<int> tmp;
char s[N];
void insert (int &p) {
int n; p=1;
scanf("%s",s); n=strlen(s);
for (int i=0;i<n;i++) {
int c=s[i]-'a';
if (!A[p][c]) A[p][c]=++cnt;
p=A[p][c]; sum[p]++;
}
}
void get_fail () {
int i;
fail[1]=0; q.push(1);
while (!q.empty()) {
int p=q.front(); q.pop(); tmp.push(p);
for (i=0;i<26;i++) {
if (A[p][i]) {
int k=fail[p];
while (!A[k][i]) k=fail[k];
fail[A[p][i]]=A[k][i];
q.push(A[p][i]);
}
}
}
while (!tmp.empty()) {
int k=tmp.top(); tmp.pop();
sum[fail[k]]+=sum[k];
}
}
AC () {
cnt=1;
for (int i=0;i<26;i++) A[0][i]=1;
}
}Ac;
int main () {
scanf("%d",&n);
for (int i=1;i<=n;i++) Ac.insert(pos[i]);
Ac.get_fail();
for (int i=1;i<=n;i++) printf("%d\n",Ac.sum[pos[i]]);
return 0;
}