码迷,mamicode.com
首页 > 编程语言 > 详细

AC自动机算法学习

时间:2018-12-19 19:39:03      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:c++   find   size   res   turn   else   ptr   return   ++   

KMP+TRIE

int val[1000100][31],tot;
int tr[1000100];
int fail[1000100];
struct AC_Trie{
    void clean(){
        tot=0;
        memset(val,0,sizeof(val));
        memset(tr,0,sizeof(tr));
        memset(fail,0,sizeof(fail));
    }
    void build(){
        queue<int> q;
        memset(fail,0,sizeof(fail));
        while(!q.empty()) q.pop();
        for(int i=0;i<26;i++) if(val[0][i]!=0) q.push(val[0][i]);
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int i=0;i<26;i++){
                if(val[u][i]!=0){
                    fail[val[u][i]]=val[fail[u]][i];
                    q.push(val[u][i]); 
                }else{
                    val[u][i]=val[fail[u]][i];
                }
            }
        }
    }
    void insert(string x){
        int len=x.length(),p=0;
        for(int i=0;i<len;i++){
            int c=x[i]-'a';
            if(val[p][c]==0) tot++,val[p][c]=tot;
            p=val[p][c];
        }
        tr[p]++;
    }
    int find(string x){
        int len=x.length(),p=0,res=0;
        for(int i=0;i<len;i++){
            p=val[p][x[i]-'a'];
            for(int j=p;j&&~tr[j];j=fail[j]) res+=tr[j],tr[j]=-1;
        }
        return res;
    }
}tree;

AC自动机算法学习

标签:c++   find   size   res   turn   else   ptr   return   ++   

原文地址:https://www.cnblogs.com/yzx1798106406/p/10145223.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!