Cod sursa(job #1189966)

Utilizator misinozzz zzz misino Data 24 mai 2014 07:36:15
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include<fstream>
#include<vector>
#include<cstring>

#define A 1000100
#define B 10010
#define C 110

using namespace std;

ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");

int i,n,p,u,sol[C];

char s[A],s1[B];

struct trie{int nr;
trie *urm , *fii[26];
vector<int>v;
trie(){
    nr = 0;
    urm = NULL;
    memset(fii,0,sizeof(fii));
}
};

trie *t = new trie,*nod,*nod2,*q[A];

inline void insereaza(trie *t , char *p , int x){
    if(!*p)
    {
        t->v.push_back(x);

        return ;
    }

    if(!t->fii[*p - 'a'])
    {
        t->fii[*p - 'a'] = new trie;
    }

    insereaza(t->fii[*p - 'a'] , p + 1 , x);
}

inline void BFS(){
    q[p = u = 1] = t;

    t->urm = t;

    while(p <= u)
    {
        nod = q[p ++];

        for(i = 0 ; i <= 25 ; ++ i)
            if(nod->fii[i] != NULL)
        {
            for(nod2 = nod->urm ; nod2 != t && nod2 -> fii[i] == NULL ; nod2 = nod2->urm);

            if(nod2->fii[i] != NULL&& nod2->fii[i] != nod->fii[i])
                nod2 = nod2->fii[i];

            nod->fii[i]->urm = nod2;

            q[++ u] = nod->fii[i];

        }
    }

    t->urm = t;
}

inline void AntiBFS(){

    for(i = u ; i >= 2 ; -- i)
    {
        nod = q[i];

        nod->urm->nr += nod->nr;

        for(vector<int>::iterator it = nod->v.begin() ; it != nod->v.end() ; ++ it)
            sol[*it] = nod->nr;
    }
}

int main()
{
    f >> s >> n;

    for(i = 1 ; i <= n ; ++ i)
    {
        f >> s1 ;

        insereaza(t , s1 , i);
    }

    BFS();

    nod = t;

    for(i = 0 ; s[i] ; ++ i)
    {
        for(; nod != t && nod->fii[s[i] - 'a'] == NULL ; nod = nod -> urm);

        if(nod->fii[s[i]-'a'] != NULL)
            nod = nod->fii[s[i]-'a'];

        ++ nod->nr;
    }

    AntiBFS();

    for(i = 1 ; i <= n ; ++ i)
        g << sol[i] << '\n';

    return 0;
}