以下是代码
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
using namespace std;
struct Node
{
Node *ch[26],*nxt;
int val;
}*ROOT,*root;
int n;
string s;
void insert(string &s)
{
int len=s.size(),c;
Node *p=root;
for(int i=0;i<len;++i)
{
c=s[i]-'a';
if(p->ch[c]==NULL)
p->ch[c]=new Node;
p=p->ch[c];
}
++p->val;
}
void build_AC()
{
for(int i=0;i<26;++i)
ROOT->ch[i]=root;
root->nxt=ROOT;
queue<Node*> q;
q.push(root);
while(!q.empty())
{
Node *u=q.front();
q.pop();
for(int i=0;i<26;++i)
if(u->ch[i]==NULL)
u->ch[i]=u->nxt->ch[i];
else
{
u->ch[i]->nxt=u->nxt->ch[i];
q.push(u);
}
}
}
int query(string &s)
{
int len=s.size(),ans=0;
Node *p=root;
for(int i=0;i<len;++i)
{
for(Node *i=p;i!=NULL&&i->val!=-1;i=i->nxt)
ans+=i->val,i->val=-1;
p=p->ch[s[i]-'a'];
}
return ans;
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>s;
insert(s);
}
cin>>s;
build_AC();
cout<<query(s);
return 0;
}
经过debug,发现在insert()函数中申请新空间时会爆(本人只发现了这里)