RT,代码如下:
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct Node
{
Node *fail,*ch[30];
int val,id,in,idx;
Node()
{
val=id=in=idx=0;
fail=NULL;
for(int i=0;i<26;++i)
ch[i]=NULL;
}
}*ROOT=new Node(),*root=new Node();
int n,cnt;
int ans[200010];
string s;
Node *item=new Node[200010];
void insert(const string &s,const int &id)
{
Node *p=root;
int len=s.size(),c;
for(int i=0;i<len;++i)
{
c=s[i]-'a';
if(p->ch[c]==NULL)
{
p->ch[c]=&item[++cnt];
p->ch[c]->idx=cnt;
}
p=p->ch[c];
}
p->id=id;
}
void build_AC()
{
root->fail=ROOT;
for(int i=0;i<26;++i)
ROOT->ch[i]=root;
queue<Node*> q;
q.push(root);
while(!q.empty())
{
Node *p=q.front();
q.pop();
for(int i=0;i<26;++i)
if(p->ch[i]==NULL)
p->ch[i]=p->fail->ch[i];
else
{
p->ch[i]->fail=p->fail->ch[i];
q.push(p->ch[i]);
}
}
}
void query(const string &s)
{
Node *p=root;
int len=s.size(),c;
for(int i=0;i<len;++i)
{
c=s[i]-'a';
p=p->ch[c];
++p->val;
}
}
void topo(Node *p)
{
while(!p->in)
{
p->fail->val+=p->val;
--(p=p->fail)->in;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>s;
insert(s,i);
}
build_AC();
cin>>s;
query(s);
queue<Node*> que;
for(Node *i=item+1;i<=item+cnt;++i)
++i->fail->in;
for(Node *i=item+1;i<=item+cnt;++i)
if(!i->in)
que.push(i);
while(!que.empty())
{
Node *p=que.front();
que.pop();
topo(p);
}
for(Node *i=item+1;i<=item+cnt;++i)
if(i->id)
ans[i->id]=i->val;
for(int i=1;i<=n;++i)
cout<<ans[i]<<endl;
return 0;
}