Cod sursa(job #1231517)

Utilizator afkidStancioiu Nicu Razvan afkid Data 20 septembrie 2014 20:35:59
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct Trie {
    int cnt, nrsons;
    Trie *son[ 26 ];

    Trie() {
        cnt = nrsons = 0;
        memset( son, 0, sizeof( son ) );
    }
};

Trie *T = new Trie;

void ins( Trie *node, char *s ) {
    if( *s == '\n' ) {
        node->cnt ++; return;
    }

    if( node->son[ *s - 'a' ] == 0 ) {
        node->son[ *s - 'a' ] = new Trie;
        node->nrsons ++;
    }

    ins( node->son[ *s-'a' ], s+1 );
}

int del( Trie *node, char *s ) {
    if( *s == '\n' )
        node->cnt --;
    else if( del( node->son[ *s-'a' ], s+1 ) ) {
            node->son[ *s-'a' ] = 0;
            node->nrsons --;
        }

    if( node->cnt == 0 && node->nrsons == 0 && nod != T ) {
        delete node; return 1;
    }
    return 0;
}

int que( Trie *node, char *s ) {
    if( *s == '\n' )
        return node->cnt;

    if( node->son[ *s-'a' ] )
        return que( node->son[ *s-'a' ], s+1 );
    return 0;
}

int pre( Trie *node, char *s, int k ) {
    if( *s == '\n' || node->son[ *s-'a' ] == 0 )
        return k;
    return pre( node->son[ *s-'a' ], s+1, k+1 );
}

int main() {
    char line[ 32 ];

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

    fgets( line, 32, stdin );

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

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