数据结构-字符串匹配AC自动机模板

来源:互联网 发布:淘宝开店审核期去哪查 编辑:程序博客网 时间:2024/05/22 05:29
struct Trie{    int next[N][26],fail[N],end[N];    int rt,L;    int newnode(){        memset(next[L],-1,sizeof(next[L]));        end[L++]=0;        return L-1;    }    void init(){//初始化        L=0;        rt=newnode();    }    void insert(char *s){//插入模式串        int n=strlen(s);        int p=rt;        for(int i=0;i<n;i++){            if(next[p][s[i]-'a']==-1)                next[p][s[i]-'a']=newnode();            p=next[p][s[i]-'a'];        }        end[p]++;    }    void build(){//建立模式串的字典树        queue<int>Q;        fail[rt]=rt;        for(int i=0;i<26;i++){            if(next[rt][i]==-1)next[rt][i]=rt;            else fail[next[rt][i]]=rt,Q.push(next[rt][i]);        }        while(!Q.empty()){            int p=Q.front();            Q.pop();            for(int i=0;i<26;i++){                if(next[p][i]==-1)next[p][i]=next[fail[p]][i];                else{                    fail[next[p][i]]=next[fail[p]][i];                    Q.push(next[p][i]);                }            }        }    }    int query(char *s){//查询匹配串的匹配度        int n=strlen(s);        int p=rt,ans=0;        for(int i=0;i<n;i++){            p=next[p][s[i]-'a'];            int t=p;            while(t!=rt){                ans+=end[t];                end[t]=0;                t=fail[t];            }        }        return ans;    }};
0 0