Cod sursa(job #1444153)

Utilizator DysKodeTurturica Razvan DysKode Data 29 mai 2015 11:58:41
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <cstring>

using namespace std;

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

struct Trie
{
    int aparitii, fii;
    Trie *urm[26],*tata;
    Trie()
    {
        aparitii = fii = 0;
        memset( urm , 0 , sizeof( urm ) );
        tata = 0;
    }
};

Trie *Tr = new Trie;
int op;
char s[30];

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;

    }

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

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

int aparitie( Trie *T , char *s )
{
    if( *s == NULL )
    {
        return T -> aparitii;
    }

    if( T -> urm[ *s - 'a' ] != 0 )
        aparitie( T -> urm[ *s - 'a' ] , s + 1 );
    else
        return 0;
}

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

int main()
{
    while( fin>>op )
    {
        fin.get( s , 25 );

        if( op == 0 )
        {
            adauga( Tr , s + 1 );
        }
        else if( op == 1 )
        {
            sterge( Tr , s + 1 );
        }
        else if( op == 2 )
        {
            fout<<aparitie( Tr , s + 1 )<<'\n';
        }
        else
        {
            fout<<prefix( Tr , s + 1 )<<'\n';
        }
    }

}