Cod sursa(job #1221396)

Utilizator acomAndrei Comaneci acom Data 20 august 2014 13:44:33
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
#define NMAX 1000005
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
struct trie
{
    int sol;
    trie *f[26];
    trie *back;
    vector <trie *> v;
    trie()
    {
        sol=0;
        back=0;
        for (int i=0;i<26;++i)
            f[i]=0;
    }
} *root,*x,*aux,*w[10005];
queue <trie *> q;
char s[10005],A[NMAX];
int n;
trie *adauga(trie *r, char *s)
{
    if (*s==0)
        return r;
    if (r->f[*s-'a']==NULL)
        r->f[*s-'a']=new trie;
    return adauga(r->f[*s-'a'],s+1);
}
int dfs(trie *nod)
{
    int i;
    for (i=0;i<nod->v.size();++i)
        nod->sol+=dfs(nod->v[i]);
    return nod->sol;
}
int main()
{
    int i;
    fin>>A>>n;
    root=new trie;
    for (i=1;i<=n;++i)
    {
        fin>>s;
        w[i]=adauga(root,s);
    }
    q.push(root);
    while (!q.empty())
    {
        x=q.front(); q.pop();
        for (i=0;i<26;++i)
            if (x->f[i])
            {
                aux=x->back;
                while (aux && aux->f[i]==NULL)
                    aux=aux->back;
                if (aux==0)
                    x->f[i]->back=root;
                else
                    x->f[i]->back=aux->f[i];
                x->f[i]->back->v.push_back(x->f[i]);
                q.push(x->f[i]);
            }
    }
    aux=root;
    for (i=0;A[i];++i)
    {
        while (aux!=root && aux->f[A[i]-'a']==NULL)
            aux=aux->back;
        if (aux->f[A[i]-'a'])
            aux=aux->f[A[i]-'a'];
        aux->sol++;
    }
    dfs(root);
    for (i=1;i<=n;++i)
        fout<<w[i]->sol<<"\n";
    return 0;
}