Cod sursa(job #1436931)

Utilizator paul_danutDandelion paul_danut Data 16 mai 2015 17:10:19
Problema Aho-Corasick Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <string.h>
using namespace std;

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

struct nod{int e; struct nod* adr[26];}root;

void init( nod  *x )
{
    x->e=0;
    for(int i=0; i<=25; i++ )
        x->adr[i]=0;
}
void addWord(int i,int j,char w[])
{
    nod *currentNod = &root;
    for(;i<=j ;i++)
        {
            if( currentNod -> adr[ w[i] - 'a' ] == NULL )
                   {
                    currentNod -> adr[ w[i] - 'a' ] = new nod;
                    init(currentNod -> adr[ w[i] - 'a' ]);
                   }

            currentNod = currentNod -> adr[ w[i] - 'a' ];
            currentNod->e++;
        }
}

int numberOfAparitions( char w[] )
{
    nod *currentNod = &root;

    for(int i=0; w[i]!=0 ;i++)
           {
           if(currentNod -> adr[ w[i] - 'a' ] != NULL)
                 {currentNod = currentNod -> adr[ w[i] - 'a' ];
                 if(currentNod->e < 1)
                     return 0;}
           else
                 return 0;
            }
    return currentNod -> e;
}

int main()
{
    init( &root );
    int n,fin;
    char w[10001];
    char a[1000001];

    f>>a;
    fin=strlen(a);
    for(int i=0;i<fin;i++)
        if(fin-i>= 10000)
            addWord(i,i+9999,a);
        else
            addWord(i,fin-1,a);

    f>>n;
    for(int i=1;i<=n;i++)
         {f>>w;
         g << numberOfAparitions(w) <<'\n';}

    f.close(); g.close();
}