就是KPM+字典树
Acwing搜索关键词
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5,s=55;
int tr[N*s][26],cnt[N*s],idx,n;
char str[1000005];
int q[N*s],nxt[N*s];
void insert(){
int p=0;
for(int i=0;str[i];++i){
int t=str[i]-'a';
if(!tr[p][t]) tr[p][t]=++idx;
p=tr[p][t];
}
cnt[p]++;
}
void build(){
int l=0,r=-1;
for(int i=0;i<26;++i){
if(tr[0][i]) q[++r]=tr[0][i];
}
while (l<=r){
int t=q[l++];
for(int i=0;i<26;++i){
int c=tr[t][i];
if(!c) tr[t][i]=tr[nxt[t]][i];
else {
nxt[c]=tr[nxt[t]][i];
q[++r]=c;
}
}
}
}
int main() {
int t;
scanf("%d",&t);
while (t--){
memset(tr,0,sizeof tr);
memset(nxt,0,sizeof nxt);
memset(cnt,0,sizeof cnt);
idx=0;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%s",str);
insert();
}
build();
scanf("%s",str);
int ans=0;
for(int i=0,j=0;str[i];++i){
int t=str[i]-'a';
j=tr[j][t];
int k=j;
while (k){
ans+=cnt[k];
cnt[k]=0;
k=nxt[k];
}
}
printf("%d\n",ans);
}
}