挂个AC自动机

struct ACM{
    int ch[N][26],f[N],cnt[N];
    int sz,rt;
    int ins(char *s){
        int n=strlen(s),u=rt;
        for(int i=0;i<n;i++){
            int c=s[i]-'a';S[tot++]=s[i];
            if(!ch[u][c])ch[u][c]=++sz;
            u=ch[u][c];
        }
        cnt[u]=1;
        return u;
    }
    void build(){
        queue<int>q;
        while(!q.empty())q.pop();
        int u=0;
        for(int c=0;c<26;c++){
            int *v=&ch[rt][c];
            if(*v)
            f[*v]=rt,q.push(*v);
            else *v=rt;
        }
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int c=0;c<26;c++){
                int *v=&ch[u][c];
                if(*v){
                    f[*v]=ch[f[u]][c];q.push(*v);
                }
                else *v=ch[f[u]][c];
            }
        }
    }
    void query(char *s){
        int n=strlen(s),u=rt;
        for(int i=0;i<n;i++){
            if(s[i]=='#'){
                u=0;continue;
            }
            int c=s[i]-'a';
            while(u&&!ch[u][c])u=f[u];
            u=ch[u][c];
            int v=u;
            while(v){
                if(cnt[v])cnt[v]++;
                v=f[v];
            }
        }
    }
}Aho;
原文地址:https://www.cnblogs.com/orzzz/p/8086774.html