【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;
}