Cod sursa(job #1117957)

Utilizator MutescuMutescu Alexandru Mutescu Data 23 februarie 2014 21:25:48
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define TY (*s - 'a')
struct arb {
    int so, tot;
    arb *rt[ 26 ];

    arb() {
        so=tot = 0;
        memset( rt, 0, sizeof( rt ) );
    }
};

arb *T = new arb;

void ins( arb *nod, char *s ) {
    if( *s == '\n' ) {
        nod->so++; return;
    }

    if( nod->rt[TY] == 0 ) {
        nod->rt[TY] = new arb;
        nod->tot++;
    }

    ins( nod->rt[ TY ], s+1 );
}

int del( arb *nod, char *s ) {
    if( *s == '\n' )
        nod->so --;
    else if( del( nod->rt[ TY ], s+1 ) ) {
            nod->rt[ TY ] = 0;
            nod->tot --;
        }

    if( nod->so == 0 && nod->tot == 0 && nod != T ) {
        delete nod; return 1;
    }
    return 0;
}

int aparitii( arb *nod, char *s ) {
    if( *s == '\n' )
        return nod->so;

    if( nod->rt[ TY ] )
        return aparitii( nod->rt[TY], s+1 );
    return 0;
}

int prefix( arb *nod, char *s, int k ) {
    if( *s == '\n' || nod->rt[TY] == 0 )
        return k;
    return prefix(nod->rt[TY], s+1, k+1 );
}

int main() {
    char linie[32];

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

    fgets( linie, 32, stdin );

    while( !feof( stdin ) ) {
        switch( linie[0] ) {
            case '0': ins(T,linie+2);break;
            case '1': del(T,linie+2);break;
            case '2': printf( "%d\n", aparitii( T, linie+2 ) ); break;
            case '3': printf( "%d\n", prefix( T, linie+2, 0 ) ); break;
        }

        fgets( linie, 32, stdin );
    }
    return 0;
}