AC自动机模板

来源:互联网 发布:乐视视频 mac 编辑:程序博客网 时间:2024/05/22 17:04

AC自动机的功能类似于kmp,用于处理多个子串匹配一个母串的问题。

主要思想是:先建立一颗trie树,然后再把空的节点补全为fail所指向的点,也就是补全一颗树,最后记得更新tag值就完了

#include <iostream>using namespace std;void add(char *str){//构建trie树 我的变量名错了(大雾)int p=1;int len=strlen(str);for(i=0;i<len;i++){    if(tri[p][str[i]-'a']==0){        trilen++;        tri[p][str[i]-'a']=trilen;    }    p=tri[p][str[i]-'a'];}tag[p]++;}int ACcreat(){//构建ac自动机 同时补全所有空的trie[i][j]指针    queue <int> q;    fail[1]=1;    for(i=0;i<26;i++){//先处理根节点的child的fail指针        if(tri[1][i]){            fail[tri[1][i]=1;            q.push(tri[1][i]);        }        else            tri[1][i]=1;    }    int u;    while(!q.empty()){//广搜所有的点 可以保证所有的fail指针之前都访问过    u=q.front();    q.pop();    for(int i=0;i<26;i++){    if(tri[u][i]){        fail[tri[u][i]]=tri[fail[u]][i];        q.push(tri[u][i]);    }    else        tri[u][i]=tri[fail[u]][i];      }      tag[u]+=tag[fail[u]];//当前节点累计结束串个数  }}int main(){scanf("%d",&m);scanf("\n%d",mstr);for(i=1;i<=m;i++){    scanf("\n%s",str);    add(str);}return 0;}


0 0
原创粉丝点击