Cod sursa(job #1545241)

Utilizator Daniel3Leu Daniel Mihai Daniel3 Data 6 decembrie 2015 16:21:13
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#define CH (*s - 'a')
#include <cstdio>
#include <cstring>
using namespace std;

struct Trie{
    int cnt, nrfii;
    Trie *fiu[26];

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

Trie *T = new Trie;

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

    if(nod->fiu[CH]==0){
        nod->fiu[CH] = new Trie();
        nod->nrfii++;
    }
    inserare(nod->fiu[CH],s+1);
}

int del(Trie *nod, char *s){
    if(*s == '\n'){
        nod->cnt--;
    }

    else if(del(nod->fiu[CH],s+1)){
        nod->fiu[CH]=0;
        nod->nrfii--;
    }

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

int que(Trie *nod, char *s){
    if(*s == '\n')
        return nod->cnt;
    if(nod->fiu[CH])
        return que(nod->fiu[CH],s+1);
    return 0;
}

int pre(Trie *nod, char *s, int k){
if(*s == '\n' || nod->fiu[CH]==0)
    return k;
return pre(nod->fiu[CH], 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': inserare( 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;
}