Cod sursa(job #615139)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 8 octombrie 2011 18:11:28
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <cstdio>
#include <cstring>

#define LMAX 25

using namespace std;

struct nod
{
    nod *L[26];
    int CateCuv, CatiFii;
    nod()
    {
        memset( L, 0, sizeof(L) );
        CateCuv = CatiFii = 0;
    }
};

nod *R;
int Tip, LC;
char Cuv[LMAX];

inline void Adauga( nod *NOD, char *lit )
{
    if( *lit == 0 )
    {
        ++(NOD -> CateCuv);
        return;
    }
    if( NOD -> L[*lit - 'a'] == NULL )
    {
        NOD -> L[*lit - 'a'] = new nod;
        ++(NOD -> CatiFii);
    }

    Adauga( NOD -> L[*lit - 'a'], lit+1 );
}

inline int Scoate( nod *NOD, char *lit )
{
    if( *lit == 0 ) --(NOD -> CateCuv);
    else if( Scoate( NOD -> L[*lit - 'a'], lit+1 ) )
    {
        NOD -> L[*lit - 'a'] = NULL;
        --(NOD -> CatiFii);
    }

    if( !(NOD -> CateCuv) && !(NOD -> CatiFii) && NOD != R )
    {
        delete NOD;
        return 1;
    }

    return 0;
}

inline int NrAparitii( nod *NOD, char *lit )
{
    if( *lit == 0 ) return NOD -> CateCuv;

    if( NOD -> L[*lit - 'a'] ) return NrAparitii( NOD -> L[*lit - 'a'], lit+1 );
    return 0;
}

inline int LGLCP( nod *NOD, char *lit, int Lg )
{
    if( *lit == 0 || NOD -> L[*lit - 'a'] == NULL ) return Lg;
    return LGLCP( NOD -> L[*lit - 'a'], lit+1, Lg+1 );
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);

    nod *R = new nod;
    do
    {
        memset( Cuv, 0, sizeof(Cuv) );
        scanf("%d %s\n", &Tip, Cuv);

        switch( Tip )
        {
            case 0:
                Adauga( R, Cuv );
                break;
            case 1:
                Scoate( R, Cuv );
                break;
            case 2:
                printf("%d\n", NrAparitii( R, Cuv ));
                break;
            case 3:
                printf("%d\n", LGLCP( R, Cuv, 0 ));
                break;
        }
    }
    while( !feof(stdin) );

    return 0;
}