AC自动机

· · 个人记录

变量

函数

代码

struct AC{
    int tr[N][26],tot;
    int e[N],fail[N];
    queue<int>q;
    void insert(string s){
        int p=0;
        for(int i=0;i<s.size();i++){
            if(!tr[p][s[i]-'a'])
                tr[p][s[i]-'a']=++tot;
            p=tr[p][s[i]-'a'];
        }
        e[p]++;
    }
    void build(){
        for(int i=0;i<26;i++)
            if(tr[0][i])
                q.push(tr[0][i]);
        while(q.size()){
            int p=q.front();
            q.pop();
            for(int i=0;i<26;i++){
                if(tr[p][i]){
                    fail[tr[p][i]]=tr[fail[p]][i];
                    q.push(tr[p][i]);
                }
                else
                    tr[p][i]=tr[fail[p]][i];
            }
        }
    }
    int query(string t){
        int p=0,ans=0;
        for(int i=0;i<t.size();i++){
            p=tr[p][t[i]-'a'];
            for(int j=p;j&&e[j]!=-1;j=fail[j]){
                ans+=e[j];
                e[j]=-1;
            }
        }
        return ans;
    }
}ac;