十分感谢各位大佬能帮我解惑。
下面代码是 P5357 【模板】AC 自动机(二次加强版)
#include<bits/stdc++.h>
using namespace std;
const int N=4e6+5;
char s[N];
int n,cnt,indeg[N],vis[N],rev[N],ans;
queue<int>q;
struct node{
int son[26];
int end,fail;
int ans;
}t[N];
void Insert(char *s,int id){
int x=0,len=strlen(s);
for(int i=0;i<len;i++){
//printf("%d ",x);
int ch=s[i]-'a';
if(t[x].son[ch]==0){
t[x].son[ch]=++cnt;
}
x=t[x].son[ch];
}
if(!t[x].end) t[x].end=id;
rev[id]=t[x].end;
return;
}
void get_fail(){
for(int i=0;i<26;i++){
if(t[0].son[i]) q.push(t[0].son[i]);
}
while(!q.empty()){
int x=q.front();
//printf("%d ",x);
q.pop();
int Fail=t[x].fail;
for(int i=0;i<26;i++){
int &y=t[x].son[i];
if(!y){
y=t[Fail].son[i];
continue;
}
t[y].fail=t[Fail].son[i];
indeg[t[Fail].son[i]]++;
q.push(y);
}
}
}
void query(char *s){
int x=0,len=strlen(s);
for(int i=0;i<len;i++){
int ch=s[i]-'a';
x=t[x].son[ch];
t[x].ans++;
}
}
void topsort(){
for(int i=0;i<=cnt;i++){
if(!indeg[i]) q.push(i);
}
while(!q.empty()){
int x=q.front();
//printf("%d ",x);
q.pop();
vis[t[x].end]=t[x].ans;
int y=t[x].fail;
t[y].ans+=t[x].ans;
indeg[y]--;
if(!indeg[y]) q.push(y);
}
}
int main(){
//freopen(Name ".in", "r", stdin);
//freopen(Name ".out", "w", stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",s);
Insert(s,i);
}
get_fail();
scanf("%s",s); query(s);
topsort();
//printf("%d\n",cnt);
for(int i=1;i<=n;i++){
printf("%d\n",vis[rev[i]]);
}
return 0;
}