欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

ac自动机添加失配指针

时间:2024-05-05 14:42 作者:admin 点击:
#include bits/stdc++.h using namespace std ; struct trie { int id = 0 ; char c; map char ,trie * m; int e = 0 ; trie * fail; } * root = NULL ; int id = 0 ; void addtrie ( string s ){ trie * p = root; for ( int i = 0 ;i s . size ();i ++ ){ i


#include <bits/stdc++.h>
using namespace std;
struct trie{
    int id=0;
    char c;
    map<char,trie*> m;
    int e=0;
    trie *fail;
} *root=NULL;
int id=0;
void addtrie(string s){
    trie *p=root;
    for(int i=0;i<s.size();i++){
        if(p->m.count(s[i])==0) p->m[s[i]]=new trie;
        p=p->m[s[i]];
        if(p->id==0) p->id= ++id;
        p->c=s[i];
    }
    p->e++;
}
void buildactrie(){
    root->fail=NULL;
    queue<trie*> q;
    q.push(root);
    while(!q.empty()){
        trie *u=q.front();
        trie *t=u->fail;
        q.pop();
        for(auto i=u->m.begin();i!=u->m.end();i++){
            if(u==root) i->second->fail=root;
            else{
                t=u->fail;
                while(t!=NULL){
                    if(t->m.count(i->first)!=0){
                        i->second->fail=t->m[i->first];
                        break;
                    }
                    t=t->fail;
                }
                if(t==NULL) i->second->fail=root;
            }
            q.push(i->second);
        }
    }
}
void cxbl(trie *p){
    queue<trie*> q;
    q.push(p);
    while(!q.empty()){
        trie *u=q.front();
        q.pop();
        for(auto i=u->m.begin();i!=u->m.end();i++){
            q.push(i->second);
        }
        cout<<u->id<<" "<<u->c<<" ";
        if(u->fail!=NULL) cout<<u->fail->id;
        cout<<endl;
    }
}
int main(){
    string s[5]={"say","she","shr","he","her"};
    root=new trie;
    for(int i=0;i<5;i++) addtrie(s[i]);
    buildactrie();
    cxbl(root);
    return 0;
}


(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%