Cod sursa(job #1234900)

Utilizator Aleks10FMI - Petrache Alex Aleks10 Data 28 septembrie 2014 12:09:43
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
//
//  main.cpp
//  trie_100
//
//  Created by Alex Petrache on 26/09/14.
//  Copyright (c) 2014 Alex Petrache. All rights reserved.
//

#include <iostream>
#include <cstring>
using namespace std;

struct Trie{
    int cnt, nrfii;
    Trie *fiu[26];
    
    Trie(){
        cnt=nrfii=0;
        memset(fiu, 0, sizeof(fiu));
    }
};

Trie *T=new Trie;

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

    if(nod->fiu[*s-'a']==0){
        nod->fiu[*s-'a']=new Trie;
        nod->nrfii++;
    }
    insert(nod->fiu[*s-'a'],s+1);
}

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

int pre(Trie *nod, char*s, int contor){
    if(*s=='\n' || nod->fiu[*s-'a']==0)
        return contor;
    return pre(nod->fiu[*s-'a'],s+1,contor+1);
}

bool del(Trie *nod, char *s){
    if(*s=='\n')
        nod->cnt--;
    else if(del(nod->fiu[*s-'a'],s+1)){
        nod->fiu[*s-'a']=0;
        nod->nrfii--;
    }
    
    if(nod->cnt==0 && nod->nrfii==0 && nod!=T){
        delete nod;
        return 1;
    }
    return 0;
}

int main(int argc, const char * argv[])
{
    char line[ 32 ];
    
    //freopen( "/Users/alexpetrache/Documents/Programare/Xcode/trie_100/trie_100/trie.in", "r", stdin );
    freopen( "trie.in", "r", stdin );
    freopen( "trie.out", "w", stdout );
    
    fgets( line, 32, stdin );
    
    while( !feof( stdin ) ) {
        switch( line[0] ) {
            case '0': insert(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;
}