Cod sursa(job #1666508)

Utilizator bogdanpaunFMI Paun Bogdan Gabriel bogdanpaun Data 28 martie 2016 05:01:19
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#include <cstring>
using namespace std;
#define ch *s - 'a'
 
struct trie{
    int cnt , nrf ;
    trie *fiu[26];
    trie(){
        cnt = nrf = 0;
        memset( fiu, 0, sizeof( fiu ) );
    }
};
trie *t = new trie;
 
void ins(trie *nod, char *s){
    if( *s == '\n' ) {  nod->cnt++;  return; }
    if( nod->fiu[ ch ] == NULL ){
        nod->nrf++;
        nod->fiu[ch] = new trie;
    }
    ins( 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->nrf--;
    }
 
    if( nod->cnt == 0 && nod->nrf == 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': ins( 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;
}