就是一个最单纯最基本的AC入门题,也是每次边学边自己写。
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
char str[1000100];
int head,tail;
struct node{
node *next[26];
node *fail;
int count;
node (){
count=0; fail=NULL;
memset(next,NULL,sizeof(next));
}
} *q[500001];
void insert(node *root){
node *p=root;
int i=0,index;
while(str[i]){
index=str[i]-'a';
if(p->next[index]==NULL) p->next[index]=new node();
p=p->next[index];
i++;
}
// printf("%d\n",i);
p->count++;
}
void build_ac(node *root){
queue<node*> q;
q.push(root);
while(!q.empty()){
node *temp=q.front();
q.pop();
node *p=NULL;
for(int i=0;i<26;i++) if (temp->next[i]){
{
//q[head++]=temp->next[i];
q.push(temp->next[i]);
if(temp==root)
{temp->next[i]->fail=root;
continue;
}
{
p=temp->fail;
while(p!=NULL){
if(p->next[i]!=NULL){
temp->next[i]->fail=p->next[i];
break;
}
p=p->fail;
}
if(p==NULL) temp->next[i]->fail=root;
}
}
}
}
}
int query(node *root){
int i=0,cnt=0,index;
node *p = root;
while(str[i]){
index=str[i]-'a';
while(p->next[index]==NULL&&p!=root) p=p->fail;
// p=p->next[index];
//p=(p==NULL)?root:p;
if (p->next[index]) p=p->next[index];
else p=root;
node *temp=p;
while(temp!=root&&temp->count!=-1){
cnt+=temp->count;
temp->count=-1;
temp=temp->fail;
}
i++;
}
return cnt;
}
int main(){
freopen("in","r",stdin);
int n,t;
scanf("%d",&t);
while(t--){
head=tail=0;
node *root = new node();
scanf("%d",&n);
while(n--){
scanf("%s",str); insert(root);
}
build_ac(root);
scanf("%s",str);
printf("%d\n",query(root));
}
return 0;
}