自學AC自動機

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std ;
const int ms=200*501;
const int ch=200*501;
const int M=100010;
const int N=510;

char s[M];
int n,m,sum;
struct Trie{
    int c[ms][ch];
    int value[ms],f[ms],last,[ms];
    int sz;
    int ans[N];
    Trie(){
        size=1;
    }
    int idx(char c){
        return (int) c;
    }
    void insert (char *s,int v){
        int u=0,len=strlen (s),i,x;
        for (i=0;i<len;i++){
            x=idx (s[i]);
            if (!c[u][x]){
                c[u][x]=sz++;
                val[sz]=0;
            }
            u=c[u][x];
        }
        val[u]=v;
    }
    void get_fail (){
        queue <int> q;
        f[0]=0;
        int i,u,now,v;
        for (i=1;i<ch;i++){
            u=c[0][i];
            if (u){
                f[u]=0;
                q.push (u);
                last[u]=0;
            }
        }
        while (!q.empty ()){
            now=q.front ();
            q.pop ();
            for (i=0;i<ch;i++){
                u=c[r][i];
                if (!u){
                    c[r][i]=c[f[r]][i];
                    continue;
                }
                q.push (u);
                v=f[r];
                while (v&!c[v][i]) v=f[v];
                f[u]=c[v][i];
                last[u]=val[f[u]] ? f[u] : last[f[u]];
            }
        }
    }
    void print(int j){//查詢並存儲匹配串
        ok = 1;
        if(j){
            ans[val[j]] = 1;
            print(last[j]);
        }
    }
    void match(char *s){//模式串匹配
        int len=strlen(s),j=0;
        int child,i;
        for(i=0;i<len;i++){
            ch=idx(s[i]);
            j=c[j][child];
            if(val[j]) print(j);
            else {
                if(val[last[j]]) print(last[j]);
            }
        }
    }
}T;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章