Cod sursa(job #1411179)

Utilizator oana28Oana Mitoiu oana28 Data 31 martie 2015 15:11:55
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
#define NMAX 1000005
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
struct trie
{
    int nr;
    trie *back;
    vector <trie *> v;
    trie *f[26];
    trie()
    {
        nr=0; back=0; v.clear();
        for (int i=0;i<26;++i)
            f[i]=0;
    }
} *root,*aux,*a[105];
queue <trie *> q;
int n;
char A[NMAX],str[NMAX],*p;
trie *adauga(trie *r, char *s)
{
    if (*s==0) return r;
    if (r->f[*s-'a']==0)
        r->f[*s-'a']=new trie;
    return adauga(r->f[*s-'a'],s+1);
}
void bfs()
{
    int i;
    trie *r;
    q.push(root);
    while (!q.empty())
    {
        r=q.front(); q.pop();
        for (i=0;i<26;++i)
            if (r->f[i])
            {
                aux=r->back;
                while (aux && aux!=root && aux->f[i]==0)
                    aux=aux->back;
                if (aux==0)
                    aux=root;
                else if (aux->f[i])
                    aux=aux->f[i];
                r->f[i]->back=aux;
                r->f[i]->back->v.push_back(r->f[i]);
                q.push(r->f[i]);
            }
    }
}
void dfs(trie *nod)
{
    for (unsigned int i=0;i<nod->v.size();++i)
    {
        dfs(nod->v[i]);
        nod->nr+=nod->v[i]->nr;
    }
}
int main()
{
    int i;
    root=new trie;
    fin>>A>>n;
    for (i=1;i<=n;++i)
    {
        fin>>str;
        a[i]=adauga(root,str);
    }
    bfs();
    aux=root;
    for (i=0;A[i];++i)
    {
        while (aux!=root && aux->f[A[i]-'a']==0)
            aux=aux->back;
        if (aux->f[A[i]-'a']) aux=aux->f[A[i]-'a'];
        aux->nr++;
    }
    dfs(root);
    for (i=1;i<=n;++i)
        fout<<a[i]->nr<<"\n";
    return 0;
}