ac自动机模板

ac自动机模板

struct Aho_Corasick_Automaton
{
    int tr[N][26],cnt[N],ne[N],idx;
    void insert(char *s)
    {
        int p=0;
        for(int i=0;s[i];i++)
        {
            int u=s[i]-'a';
            if(!tr[p][u]) tr[p][u]=++idx;
            p=tr[p][u];
        }
        cnt[p]++;
    }
    void build()
    {
        queue<int>q;
        for(int i=0;i<26;i++)
            if(tr[0][i]) q.push(tr[0][i]),ne[tr[0][i]]=0;
        while(q.size())
        {
            int u=q.front(); q.pop();
            for(int i=0;i<26;i++)
                if(tr[u][i]) ne[tr[u][i]]=tr[ne[u]][i],q.push(tr[u][i]);
                else tr[u][i]=tr[ne[u]][i];
        }
    }
    int query(char *s)
    {
        int ans=0,now=0;
        for(int i=0;s[i];i++)
        {
            int u=s[i]-'a';
            now=tr[now][u];
            for(int t=now;t&&~cnt[t];t=ne[t]) ans+=cnt[t],cnt[t]=-1;
        }
        return ans;
    }
}AC;

 

posted @ 2020-07-29 14:41  Libra_Glow  阅读(44)  评论(0)    收藏  举报