Cod sursa(job #1829009)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 14 decembrie 2016 10:47:36
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CH (*s-'a')

struct IlluminaTrie{
    int cnt, nrfii;
    IlluminaTrie *plod[26];

    IlluminaTrie(){
        cnt=nrfii=0;
        memset(plod, 0, sizeof(plod));
    }
};

IlluminaTrie *T=new IlluminaTrie;

void ins(IlluminaTrie *nod, char *s){
    if(*s=='\n')
        nod->cnt++;
    else{
        if(nod->plod[CH]==0){
            nod->plod[CH]=new IlluminaTrie;
            nod->nrfii++;
        }
        ins(nod->plod[CH], s+1);
    }
}

int del(IlluminaTrie *nod, char *s){
    if(*s=='\n')
        nod->cnt--;
    else if(del(nod->plod[CH], s+1)){
        nod->plod[CH]=0;
        nod->nrfii--;
    }
    if(nod->cnt==0 && nod->nrfii==0 && nod!=T){
        delete nod;
        return 1;
    }
    return 0;
}

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

int pre(IlluminaTrie *nod, char *s, int k){
    if(*s=='\n' || nod->plod[CH]==0)
        return k;
    return pre(nod->plod[CH], s+1, k+1);
}

int main(){
    char line[32];
    FILE*fi,*fo;
    fi=fopen("trie.in","r");
    fo=fopen("trie.out","w");
    fgets(line, 32, fi);
    while(!feof(fi)){
        switch(line[0]){
            case '0':ins(T, line+2);break;
            case '1':del(T, line+2);break;
            case '2':fprintf(fo,"%d\n", que(T, line+2)); break;
            case '3':fprintf(fo,"%d\n", pre(T, line+2, 0)); break;
        }
        fgets(line, 32, fi);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}