Cod sursa(job #1457640)

Utilizator DysKodeTurturica Razvan DysKode Data 3 iulie 2015 19:53:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie
{
    int fii,aparitii;
    Trie *urm[26] , *tata;

    Trie()
    {
        fii = aparitii = 0;
        memset( urm , 0 , sizeof( urm ) );
        tata = 0;
    }

};

char cuvant[30];
int operatie,i,j,n,m;
Trie *Tr;

void adauga( Trie *T, char *s )
{
    if( *s == NULL )
    {
        T -> aparitii ++;
        return;
    }

    if( T -> urm[ *s - 'a' ] == 0 )
    {
        T -> urm[ *s - 'a' ] = new Trie;
        T -> urm[ *s - 'a' ] -> tata = T;
        T -> fii ++;
    }

    adauga( T -> urm[ *s - 'a' ] , s + 1 );
}

void sterge( Trie *T , char *s )
{
    if( *s == NULL )
    {
        T -> aparitii --;

        if( T -> fii == 0 && T -> aparitii == 0 )
        {
            T -> tata -> fii --;
            T -> tata -> urm[ *( s - 1 ) - 'a' ] = 0;
            delete T;
        }

        return;
    }
    else
    {
        sterge( T -> urm[ *s - 'a' ] , s + 1 );
        if( T -> fii == 0 && T -> aparitii == 0 && T != Tr )
        {
                T -> tata -> fii --;
                T -> tata -> urm[ *( s - 1 ) - 'a' ] = 0;
            delete T;
        }
        return;
    }
}

int aparitie( Trie *T , char *s )
{
    if( *s == NULL )
        return ( T -> aparitii );
    else
    {
        if( T -> urm[ *s - 'a' ] )
            return aparitie( T -> urm[ *s - 'a' ] , s + 1 );
        else
            return 0;
    }
}

int prefix( Trie *T , char *s )
{
    if( *s == NULL )
    {
        return 0;
    }
    else
    {
        if( T -> urm[ *s - 'a'] )
            return prefix( T -> urm[ *s - 'a' ] , s + 1 ) + 1 ;
        else
            return 0;
    }
}

int main()
{
    Tr = new Trie;


    while( fin>>operatie )
    {

        fin.get( cuvant , 25 );

        if( operatie == 0 )         ///  Adaugare
        {
            adauga( Tr , cuvant + 1 );
        }
        else if( operatie == 1 )    ///  Stergere
        {
            sterge( Tr , cuvant + 1 );
        }
        else if( operatie == 2 )    ///  Aparitii
        {
            fout<<aparitie( Tr , cuvant + 1 )<<'\n';
        }
        else if( operatie == 3 )    ///  Prefix
        {
            fout<<prefix( Tr , cuvant + 1 )<<'\n';
        }

    }


return 0;
}