Cod sursa(job #1218448)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 11 august 2014 11:32:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <cstdio>
#include <cstring>
#define MAXLEN 20
#define SIGMA 26

char line[MAXLEN + 4];

struct Trie{
    int nr, sons;
    Trie *son[SIGMA];

    Trie() {
        nr = sons = 0;
        for( int i = 0 ; i < SIGMA ; ++i )
            son[i] = 0;
    }
};

Trie *T = new Trie;

void add( char *s, Trie *nod ) {
    if( *s == '\n' ) {
        nod -> nr++;
        return;
    }

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

    add( s + 1, nod -> son[*s - 'a' ] );
}
int del( char *s, Trie *nod ) {
    if( *s == '\n' )
        nod -> nr--;
    else if( del( s + 1, nod -> son[*s - 'a' ] ) ) {
        nod -> son[*s - 'a' ] = 0;
        --nod -> sons;
    }

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

    return 0;
}

int nrap( char *s, Trie *nod ) {
    if( *s == '\n' )
        return nod -> nr;

    if( nod -> son[*s - 'a'] )
        return nrap( s + 1, nod -> son[*s - 'a'] );

    return 0;
}

int prefix( char *s, Trie *nod, int k ) {
    if( *s == '\n' || nod -> son[*s - 'a'] == 0 )
        return k;

    return prefix( s + 1, nod -> son[*s - 'a'], k + 1 );
}

int main () {
    FILE *f, *g;
    f = fopen( "trie.in", "r" );
    g = fopen( "trie.out", "w" );

    fgets( line, MAXLEN + 4, f );

    while( !feof( f ) ) {
        switch( line[0] ) {
            case '0':
                add( line + 2, T );
                break;
            case '1':
                del( line + 2, T );
                break;
            case '2':
                fprintf( g, "%d\n", nrap( line + 2, T ) );
                break;
            case '3':
                fprintf( g, "%d\n", prefix( line + 2, T, 0 ) );
                break;
            }

        fgets( line, 32, f );
    }

    fclose( f );
    fclose( g );
    return 0;
}