Cod sursa(job #792087)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 26 septembrie 2012 13:43:08
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb

#include <cstdio>
#include <fstream>
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#include <string>

using namespace std;

#define pb push_back

struct trie {
    int vl;
    trie *nxt,*f[26];
    vector<trie*> V;
    trie (){
        vl=0;
        nxt=0;
        memset(f,0,sizeof(f));
    }
};
trie *T=new trie;
trie *w[105];
int n;
string A,B;

inline trie* add (trie *nw,int is)
{
    if(is==B.size())
        return nw;
    if(nw->f[B[is]-'a']==0)
        nw->f[B[is]-'a']=new trie;
    return add(nw->f[B[is]-'a'],is+1);
}

void read ()
{
    ifstream in ("ahocorasick.in");
    in>>A>>n;
    for(int i=1;i<=n;++i)
    {
        in>>B;
        w[i]=add(T,0);
    }
}

void BFS ()
{
    queue<trie*> q;
    for(q.push(T);q.size();q.pop())
    {
        trie *nw=q.front();
        for(int i=0;i<26;++i)
            if(nw->f[i])
            {
                trie *a;
                for(a=nw->nxt;a&&a->f[i]==0;a=a->nxt);
                if(a)
                {
                    nw->f[i]->nxt=a->f[i];
                    a->f[i]->V.pb(nw->f[i]);
                }
                else
                {
                    nw->f[i]->nxt=T;
                    T->V.pb(nw->f[i]);
                }
                q.push(nw->f[i]);
            }
    }
}

void solve ()
{
    trie *nw=T;
    for(size_t i=0;i<A.size();++i)
    {
        for(;nw&&nw->f[A[i]-'a']==0;nw=nw->nxt);
        if(!nw)
            nw=T;
        else
        {
            nw=nw->f[A[i]-'a'];
            ++nw->vl;
        }
    }
}

inline void DFS (trie *nw)
{
    for(vector<trie*>::iterator it=nw->V.begin();it<nw->V.end();++it)
    {
        DFS(*it);
        nw->vl+=(*it)->vl;
    }
}

void out ()
{
    freopen ("ahocorasick.out","w",stdout);
    for(int i=1;i<=n;++i)
        printf("%d\n",w[i]->vl);
}

int main ()
{

    read ();
    BFS ();
    solve ();
    DFS(T);
    out ();

    return 0;
}