Cod sursa(job #1166006)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 3 aprilie 2014 09:38:28
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<fstream>


using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

char cuv[50];
int nr , op;

struct nod_trie{
    int nrf , nrc;
    nod_trie *f[26];

    nod_trie(){
        nrc = nrf = 0;
        for( int i = 0 ; i < 26 ; i++ )
            f[i] = 0;
    }

} *r;

void add( nod_trie* r , char* c ){

    if( (*c) == '\0' ){
        r->nrc++;
        return;
    }

    if( r->f[(*c)-'a'] == 0 ){
        r->f[(*c)-'a'] = new nod_trie;
        r->nrf++;
    }

    add( r->f[(*c)-'a'] , c+1 );
}

void deletec( nod_trie *r , char* c ){
    if( (*c) == '\0' ){
        r->nrc--;
        return;
    }

    deletec( r->f[(*c) - 'a'] , c+1 );

    if( r->f[(*c) - 'a']->nrf == 0 && r->f[(*c) - 'a']->nrc == 0 ){
        delete r->f[(*c) - 'a'];
        r->f[(*c) - 'a'] = 0;
        r->nrf--;
    }

}

void pref( nod_trie* r , char* c ){

    if( (*c) == '\0' )
        return;

    if( r->f[(*c) - 'a'] != 0 ){
        nr++;
        pref( r->f[(*c) - 'a'] , c + 1 );
    }

}

int aparitii( nod_trie *r , char* c ){
    if( (*c) == '\0' ){
        return r->nrc;
    }

    if( r->f[ (*c) - 'a' ] == 0 )
        return 0;

    return aparitii( r->f[ (*c) - 'a' ] , c+1 );
}

int main(){

    r = new nod_trie;

    while( (f>>op) ){

        f>>cuv;

        switch( op ){

        case 0:
        add( r , cuv );
        break;

        case 1:
        deletec( r , cuv );
        break;

        case 2:
        g<<aparitii( r , cuv )<<"\n";
        break;

        default:

        nr = 0;

        pref( r,  cuv );

        g<<nr<<"\n";

        break;

        }

    }


    return 0;
}