Cod sursa(job #2233381)

Utilizator danielsociuSociu Daniel danielsociu Data 23 august 2018 08:57:42
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include "string.h"
#include <cstdio>
std::ifstream cin("trie.in");
std::ofstream cout("trie.out");
#define CH (*s-'a')

typedef struct trie{
    int nrfii,nrcuv;
    trie *l[28];
    trie(){
        nrcuv=nrfii=0;
    }
};
trie *T= new trie;

void ins(trie *tr, char *s){
    if(*s=='\0'){
        tr->nrcuv++; return;
        }
    if(tr->l[CH]==0){
        tr->l[CH]=new trie;
        tr->nrfii++;
    }
    ins(tr->l[CH],s+1);
}

int del(trie *tr, char *s){
    if(*s=='\0')
        tr->nrcuv--;
    else if(del(tr->l[CH],s+1)){
        tr->nrfii--;
        tr->l[CH]=0;
    }
    if(tr->nrcuv==0&&tr->nrfii==0&&tr!=T){
        delete tr; return 1;
    }
    return 0;
}

int que(trie *tr,char *s){
    if(*s=='\0')
        return tr->nrcuv;
    if(tr->l[CH])
        que(tr->l[CH],s+1);
    return 0;
}

int pref(trie *tr, char *s, int k){
    if(*s=='\0'||tr->l[CH]==0)
        return k;
    return pref(tr->l[CH],s+1,k+1);
}

int main()
{
    char line[ 32 ];
    //couldn't figure out the reading so I used the
    freopen( "trie.in", "r", stdin );
    freopen( "trie.out", "w", stdout );
    //source code from the solving example
    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", pref( T, line+2, 0 ) ); break;
        }

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