zoukankan      html  css  js  c++  java
  • AC自动机 [模板]

    View Code
    #define ROOT 0
    const int MAX_NODE=100100;//stringnum*stringlen
    const int CHI=26; //儿子数
    
    struct ACtree {
        int size;
        int hash[300];
        int val[MAX_NODE];
        int fail[MAX_NODE];
        int SQ[MAX_NODE];
        int chd[MAX_NODE][CHI];
        void get_hash() {
            int i,j,k;
            for(i=0;i<CHI;i++) 
                hash[i+'A']=i; //只有大写,小写A->a,可见字符A->32,CHI-128
        }
        void init() {
            size=fail[0]=0;
            memset(val,0,sizeof(val));
            memset(chd[0],0,sizeof(chd));
        }
        void insert(char *str,int k) {
            int i,j,id,p=ROOT;
            for(i=0;str[i];i++) {
                id=hash[str[i]];
                if(!chd[p][id]) {
                    chd[p][id]=++size;
                    memset(chd[size],0,sizeof(chd[size]));
                }
                p=chd[p][id];
            }
            val[p]=k;
        }
        void build() {
            int i,j,k,id,p=ROOT,r,v;
            int qhead,qtail;
            qhead=qtail=0;
            for(i=0;i<CHI;i++) {
                if(chd[p][i]) {
                    SQ[qtail++]=chd[p][i];
                    fail[chd[p][i]]=ROOT;
                }
            }
            while(qhead!=qtail) {
                r=SQ[qhead++];
                for(i=0;i<CHI;i++) {
                    v=chd[r][i]; 
                    if(v) SQ[qtail++]=v,fail[v]=chd[fail[r]][i];
                    else chd[r][i]=chd[fail[r]][i];
                }
            }
        }
        void solve(char *str) {
            int p=ROOT;
            for(int i=0;str[i];i++) {
                int id=hash[str[i]];
                p=chd[p][id];
                int tmp=p;
                while(tmp!=ROOT) {
                    if(val[tmp])  //find one
                        tmp=fail[tmp]; //continue
                }
            }
        } //solve
    }AC;
    
    void get_data() {
        char str[100]; AC.init();
        for(int i=1;i<=M;i++) {
            scanf("%s",str);
            AC.insert(str,i);
        }
    }
    void solve() {  
        AC.build();
        AC.solve();
    }
    int main() {
        AC.get_hash();
        return 0;
    }
  • 相关阅读:
    【Codevs 2630】宝库通道
    【Codevs 2115】数集分割
    【HDU2037】今年暑假不AC
    【Codeforces】Round #376 (Div. 2)
    【Dairy】2016.10.17-1 OIer最悲剧的事情
    【Codevs 3115】高精度练习之减法
    【Codevs1080】质数环
    【T^T 1871】获取敌情
    【Codevs3151】交通管制I
    【Codeforces】716D Complete The Graph
  • 原文地址:https://www.cnblogs.com/zhang1107/p/3059039.html
Copyright © 2011-2022 走看看