Luogu3796 【模板】AC自动机(加强版)

https://www.luogu.org/problemnew/show/P3796

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+4;
int tot=0,sum[maxn];
struct node{
    int fail,next[26],tag,end;
}z[maxn];
inline void insert(char *s,int m){
    int len=strlen(s);
    int now=0;
    for(int i=0;i<len;i++){
        int v=s[i]-'a';
        if(!z[now].next[v]) z[now].next[v]=++tot;
        now=z[now].next[v];
    }
    //z[now].tag++;
    z[now].end=m;
}
inline void build_AC(){
    queue<int>q;
    for(int i=0;i<26;i++) {
        z[z[0].next[i]].fail=0;
        if(z[0].next[i]) q.push(z[0].next[i]);
    }
    while(!q.empty()){
        int now=q.front();q.pop();
        for(int i=0;i<26;i++){
            if(z[now].next[i]){
                z[z[now].next[i]].fail=z[z[now].fail].next[i];
                q.push(z[now].next[i]);
            }else{
                z[now].next[i]=z[z[now].fail].next[i];
            }
        }
    }
}
inline void AC_query(char *s){
    int len=strlen(s);
    int now=0;
    for(int i=0;i<len;i++){
        now=z[now].next[s[i]-'a'];
        int t=now;
        while(t){
            sum[z[t].end]++;
            t=z[t].fail;
        }
    }
}
char s[maxn];
char st[154][74];
int main(){
    int n;
    while(cin>>n){
        tot=0;
        memset(z,0,sizeof(z));
        memset(sum,0,sizeof(sum));
        if(n==0) return 0;
        for(int i=1;i<=n;i++){
            scanf("%s",st[i]);
            insert(st[i],i);
        }
        build_AC();
        scanf("%s",s);
        AC_query(s);
        int ans=0;
        for(int i=1;i<=n;i++) ans=max(ans,sum[i]);
        printf("%d
",ans);
        for(int i=1;i<=n;i++){
            if(sum[i]==ans) printf("%s
",st[i]);
        }
    }
}
原文地址:https://www.cnblogs.com/wifimonster/p/10480901.html