传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3172
指针模板
Code:
#include<bits/stdc++.h>
#define idx(c) (c-'a')
using namespace std;
const int maxn=205;
const int maxlen=1e6+205;
int n,len,anss[maxn];
char s[maxlen],str[maxlen];
struct node{
vector<int>val;
node *go[27],*fail,*last;
node(node *C=0){
for(int i=0;i<27;i++)go[i]=C;
fail=last=C;
}
}*root,*Null;
void insert(const char *s,int x){
node *u=root;int len=strlen(s);
for(int i=0;i<len;i++){
int v=idx(s[i]);
if(u->go[v]==Null)u->go[v]=new node(Null);
u=u->go[v];
}u->val.push_back(x);
}
void get_fail(){
queue<node*>q;
for(int i=0;i<27;i++)if(root->go[i]!=Null)
q.push(root->go[i]),root->go[i]->fail=root->go[i]->last=root;
while(!q.empty()){
node *u=q.front(),*v;q.pop();
for(int i=0;i<27;i++)if((v=u->go[i])!=Null){
q.push(v);node *j=u->fail;
while(j!=Null&&j->go[i]==Null)j=j->fail;
v->fail=j->go[i];
v->last=v->fail->val.size()?v->fail:v->fail->last;
}
}
}
void calc(node *j){
for(int i=0;i<j->val.size();i++)
anss[j->val[i]]++;
if(j->last!=Null)calc(j->last);
}
void find(){
node *j=root;
for(int i=0;i<len;i++){
int v=idx(str[i]);
while(j!=Null&&j->go[v]==Null)j=j->fail;
j=j->go[v];
if(j->val.size())calc(j);
else if(j->last!=Null)calc(j->last);
}
}
int main(){
Null=new node();root=Null;
for(int i=0;i<27;i++)Null->go[i]=Null;
Null->fail=Null->last=Null;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",s);copy(s,s+strlen(s),str+len);len+=strlen(s);str[len++]='{';
insert(s,i);
}get_fail();
find();
for(int i=1;i<=n;++i)printf("%d\n",anss[i]);
return 0;
}