题目链接:点击打开链接
解题:经典AC自动机题目
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef long long ll;
const int mx = 5e5+10;
int n,m,root,tot;
int nxt[mx][26],fail[mx],key[mx];
int init(){
memset(nxt[tot],0,sizeof(nxt[tot]));
return tot++;
}
char str[mx*2];
void insert(){
int len = strlen(str),now = root;
for(int i = 0;i < len ;i++){
int id = str[i]-'a';
if(!nxt[now][id]) nxt[now][id] = init();
now = nxt[now][id];
}
key[now]++;
}
void Getfail(){
queue<int> skt;
skt.push(root);
while(!skt.empty()){
int temp=skt.front();
skt.pop();
for(int i=0;i<26;i++){
int son = nxt[temp][i];
if(son){
if(temp == root) fail[son]=root;
else{
int p = fail[temp];
while(p != -1){
if(nxt[p][i]){
fail[son] = nxt[p][i];
break;
}
p = fail[p];
}
if(p == -1) fail[son] = root;
}
skt.push(son);
}
}
}
}
int query(){
int len=strlen(str),flag=0;
int p =root,temp,ans = 0;
for(int i=0;i<len;i++){
int id = str[i]-'a';
while(!nxt[p][id]&&p!=root) p=fail[p];
p = nxt[p][id];
if(!p) p=root;
temp = p;
while(temp!=root){
if(key[temp]>=0){
ans+= key[temp];
key[temp]=-1;
}else break;
temp = fail[temp];
}
}
return ans;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
fail[0] = -1,tot = 0,root = init();
memset(key,0,sizeof(key));
for(int i=1;i<=n;i++){
scanf("%s",str);
insert();
}
Getfail();
scanf("%s",str);
printf("%d\n",query());
}
return 0;
}