【MOBAN】AC自动机模板

自从学会用指针写数据结构后就一发不可收拾了orz.这是一个弱智的AC自动机模板,

AC自动机构建就是先构造一颗trie树,之后一层一层的,如果有儿子就将他儿子的fail数组指向他的fail的那个儿子,如果没有,他的那个儿子就是他fail的儿子(对于根节点没有就指向根节点)

struct node {
    node *nt[10],*fail; bool wx;
}z[1555],*rt; int tot;
int n,m;
char ss[1555];int le;
void ins() {
    node *p = rt;
    for(int i=1;i<=le;i++) {
        if(p->nt[ss[i]-'0']==NULL) p->nt[ss[i]-'0']=&z[++tot];
        p = p->nt[ss[i]-'0'];
    }
    p->wx = 1;
}
queue<node*>q;
void makeac() {
    node *p = rt;
    for(int i=0;i<10;i++) {
        if(p->nt[i]!=NULL) p->nt[i]->fail = p,q.push(p->nt[i]) ;
        else p->nt[i] = p;
    }
    while(q.size()) {
        p = q.front(); q.pop(); p->wx|=p->fail->wx;
        for(int i=0;i<10;i++) {
            if(p->nt[i]!=NULL) p->nt[i]->fail = p->fail->nt[i],q.push(p->nt[i]);
            else p->nt[i] = p->fail->nt[i]; 
        }
    }
    rt->nt[0]=rt;
}

 

posted @ 2018-10-05 21:06  Newuser233  阅读(7)  评论(0)    收藏  举报