http://acm.uestc.edu.cn/bbs/read.php?tid=4294
写了个入门的模板题,HDU2222;
#include <iostream>
#include<string.h>
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
node *fail,*s[27];
int w;
}*head;
char temp[51],str[1000001];
queue<node *>myqueue;
node *getfail(node *p,int k)
{
if(p->s[k]!=NULL)
return p->s[k];
else
{
if(p==head)
return head;
else
return getfail(p->fail,k);
}
}
void build_trie()
{
node *root=head;
node *tep;
for(int i=0;i<strlen(temp);i++)
{
if(root->s[temp[i]-'a']==NULL)
{
tep=new node;
for(int j=0;j<26;j++)
tep->s[j]=NULL;
tep->w=0;
tep->fail=head;
root->s[temp[i]-'a']=tep;
}
root=root->s[temp[i]-'a'];
if(i==strlen(temp)-1)
{
root->w+=1;
}
}
}
void build_ac()
{
node *root;
while(!myqueue.empty())
myqueue.pop();
myqueue.push(head);
while(!myqueue.empty())
{
root=myqueue.front();
myqueue.pop();
for(int j=0;j<26;j++)
{
if(root->s[j]!=NULL)
{
myqueue.push(root->s[j]);
if(root==head)
root->s[j]->fail=head;
else
root->s[j]->fail=getfail(root->fail,j);
}
}
}
return ;
}
int find()
{
int len=strlen(str);
int sum=0;
node *tep;
node *root=head;
for(int j=0;j<len;j++)
{
while(root->s[str[j]-'a']==NULL&&root!=head)
root=root->fail;
root=(root->s[str[j]-'a']==NULL)?head:root->s[str[j]-'a'];
tep=root;
while(tep!=head)
{
sum+=tep->w;
tep->w=0;
tep=tep->fail;
}
}
//cout<<sum<<endl;
return sum;
}
int main(){
int t;
scanf("%d",&t);
while (t--){
head=new node;
int i,n;
for (i=0;i<26;i++)
head->s[i]=NULL;
head->fail=head;
head->w=0;
scanf("%d",&n);
for (i=0;i<n;i++){
scanf("%s",temp);
build_trie();
}
build_ac();
scanf("%s",str);
printf("%d\n", find());
}
return 0;
}