自动机学习笔记

· · 个人记录

简单概念:

Trie 树

AC自动机

序列自动机

后缀自动机

广义后缀自动机

void inserttrie(string t){
    int len=t.size(),x=0;
    for(int i=0;i<len;i++){
        int k=t[i]-'a';
        if(!ch[x][k]) ch[x][k]=++tot;
        x=ch[x][k];
    }
}
void buildtrie(){
    link[0]=-1;
    for(int i=1;i<=n;i++) inserttrie(s[i]);
}
int insert(int c,int last){
    int k=ch[last][c],p=link[last];
    //if(len[k]) return k;
    len[k]=len[last]+1;
    for(;p!=-1&&!ch[p][c];p=link[p]) ch[p][c]=k;
    if(p==-1) link[k]=0;
    else{
        int q=ch[p][c];
        if(len[q]==len[p]+1) link[k]=q;
        else{
            int nk=++tot;link[nk]=link[q],len[nk]=len[p]+1;
            for(int i=0;i<26;i++) if(len[ch[q][i]]) ch[nk][i]=ch[q][i];
            for(;p!=-1&&ch[p][c]==q;p=link[p]) ch[p][c]=nk;
            link[k]=link[q]=nk;
        }
    }
    return k;
}
void bfs(){
    queue<pii> q;
    for(int i=0;i<26;i++) if(ch[0][i]) q.push(mp(i,0));
    while(!q.empty()){
        pii x=q.front();q.pop();
        int last=insert(x.fi,x.se);
        for(int i=0;i<26;i++) if(ch[last][i]) q.push(mp(i,last));
    }
}