AC自动机

来源:互联网 发布:卡拉瓦乔 知乎 编辑:程序博客网 时间:2024/06/06 08:53
const int maxn=10000010,M=26;struct node{int num;node *nt[M],*fail;void init(){num=0;for(int i=0;i<M;i++) nt[i]=NULL;fail=NULL;}}T[maxn];#define root Tint cnt;void insert(char *s){node *p=root;for(int i=0;s[i];i++){int t=s[i]-'a';if(!p->nt[t]){T[cnt].init();p->nt[t]=&T[cnt++];}p=p->nt[t];}p->num++;}void buildfail(){queue<node*> q;node* p=root;q.push(p);while(!q.empty()){node* f=q.front(); q.pop();for(int i=0;i<26;i++){if(f->nt[i]){node *tmp=f->fail;while(tmp&&!tmp->nt[i]) tmp=tmp->fail;if(!tmp) f->nt[i]->fail=root;else f->nt[i]->fail=tmp->nt[i];q.push(f->nt[i]);}}}}int search(char *s){int ans=0;node *p=root;while(*s){int t=*s-'a';while(!p->nt[t]&&p!=root) p=p->fail;p=p->nt[t]; if(!p) p=root;node* tp=p;while(tp!=root && tp->num!=-1){ans+=tp->num;tp->num=-1;tp=tp->fail;}s++;}return ans;}