Cod sursa(job #1222187)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 22 august 2014 15:02:48
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <vector>
#include <queue>
#define DIM1 1000011
#define DIM2 10011
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
int n;

struct trie{
    int sol;
    trie *p[26],*ret;
    vector<trie *> v;
    trie(){
        ret=0,sol=0;
        v.clear();
        for(int i=0;i<26;i++)   p[i]=0;
    }
};

trie *root,*w[101],*nod,*aux;
char S[DIM1],a[DIM2],*P;

queue<trie *> Q;

trie *update(trie *r,char *s){
    #define fiu p[*s-'a']
    if(*s){
        if(r->fiu==NULL)
            r->fiu=new trie;
        return update(r->fiu,s+1);
    }
    else
        return r;
}

void dfs(trie *nod){
    for(register int i=0;i<nod->v.size();i++){
        dfs(nod->v[i]);
        nod->sol+=nod->v[i]->sol;
    }
}

int main(void){
    register int i,j;

    root=new trie;
    f>>S;
    f>>n;
    for(i=1;i<=n;i++)
        f>>a,w[i]=update(root,a);

    Q.push(root);

    while(!Q.empty()){
        nod=Q.front();
        Q.pop();
        for(i=0;i<26;i++){
            #define fiu p[i]
            if(nod->fiu){
                //construim back-ul pt nod->fiu
                aux=nod->ret;
                while(aux && aux->fiu==NULL) aux=aux->ret;

                if(aux==0)
                    nod->fiu->ret=root;
                else
                    nod->fiu->ret=aux->fiu;
                nod->fiu->ret->v.push_back(nod->fiu);
                Q.push(nod->fiu);
            }
        }
    }

    nod=root;
    for(P=S;*P;P++){
        #define fiu p[*P-'a']
        while(nod!=root && nod->fiu==NULL)  nod=nod->ret;
        if(nod->fiu!=NULL) nod=nod->fiu;
        nod->sol++;
    }

    dfs(root);

    for(i=1;i<=n;i++)
        g<<w[i]->sol<<"\n";
    f.close();
    g.close();
    return 0;
}