Cod sursa(job #1754406)

Utilizator AlexandruRudiAlexandru Rudi AlexandruRudi Data 8 septembrie 2016 07:49:21
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
#include <cstring>

#define CH (*s - 'a')

using namespace std;

struct Trie{
    int nr, nrfii;
    Trie *fii[26];

    Trie(){
        nr=0; nrfii=0;
        for(int i=0;i<=26;i++) fii[i]=0;
    }
};

Trie *T = new Trie;

void add(Trie *nod, string s, int p){
   if(s[p]==0){
        nod->nr++;
        return;
   }
   else{
        if(nod->fii[s[p]-'a']==0){
            nod->fii[s[p]-'a'] = new Trie;
            nod->nrfii++;
        }
        add(nod->fii[s[p]-'a'], s, p+1);
   }
}

bool rem(Trie *nod, string s, int p){
    if(s[p]==0){
        nod->nr--;
    }
    else if(rem(nod->fii[s[p]-'a'],s,p+1)){
        nod->nrfii--;
        nod->fii[s[p]-'a']=0;
    }
    if(nod->nr==0 && nod->nrfii==0 && nod!=T){
        delete nod; return 1;
    }
    return 0;
}

int qry(Trie *nod, string s, int p){
    if(s[p]==0){
        return nod->nr;
    }
    else{
        if(nod->fii[s[p]-'a']==0) return 0;
        else{
            return qry(nod->fii[s[p]-'a'],s,p+1);
        }
    }
}

int lng(Trie *nod, string s, int p){
    if(s[p]==0){
        return p;
    }
    else{
        if(nod->fii[s[p]-'a']==0) return p;
        else{
            return lng(nod->fii[s[p]-'a'],s,p+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': add( T, line+2 ); break;
            case '1': rem( T, line+2 ); break;
            case '2': printf( "%d\n", qry( T, line+2 ) ); break;
            case '3': printf( "%d\n", lng( T, line+2, 0 ) ); break;
        }

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