Cod sursa(job #867928)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 30 ianuarie 2013 13:30:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

struct Trie{

    int nrfii;
    int contor;
    Trie *fiu[26];

    Trie() {
        contor = nrfii = 0;
        memset( fiu, 0, sizeof( fiu ) );
    }
};

Trie *T = new Trie;

void adauga(Trie *nod , char *s){

    if(*s == '\n'){

        nod->contor++;
        return ;
    }

    if(nod->fiu[*s - 'a'] == 0){

        nod->fiu[*s - 'a'] = new Trie;
        nod->nrfii++;
    }

    adauga(nod->fiu[*s-'a'], s+1);
}

inline int sterge(Trie *nod, char *s){

    if(*s == '\n')
        nod->contor--;
    else
        if( sterge(nod->fiu[*s - 'a'], s+1) ){

            nod->fiu[*s - 'a'] = 0;
            nod->nrfii--;
        }

    if(nod->contor == 0 && nod->nrfii == 0 && nod != T){

        delete nod;
        return 1;
    }

    return 0;
}

inline int aparitii(Trie *nod, char *s){

    if(*s == '\n')
        return nod->contor;

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

    return 0;
}

inline int lungime(Trie *nod, char *s, int nr){

    if(*s == '\n' || nod->fiu[*s - 'a'] == 0)
        return nr;

    return lungime(nod->fiu[*s-'a'], s+1, nr+1);
}

void rezolva(){

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

    char s[32];

    fgets(s, 32, stdin);

    while( !feof(stdin) ){

        switch(s[0]) {

            case '0': adauga( T, s+2 );     break;
            case '1': sterge( T, s+2 );     break;
            case '2': printf( "%d\n", aparitii( T, s+2 ) );     break;
            case '3': printf( "%d\n", lungime( T, s+2, 0 ) );   break;
        }

        fgets(s, 32, stdin);
    }
}

int main(){

    rezolva();

    return 0;
}