Cod sursa(job #1710885)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 29 mai 2016 22:28:53
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CH (*s-'a')

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

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

Trie *T=new Trie;

void ins(Trie *nod, char *s){
    if(*s=='\n')
        nod->cnt++;
    else{
        if(nod->fiu[CH]==0){
            nod->fiu[CH]=new Trie;
            nod->nrfii++;
        }
        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->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];
    FILE*fi,*fo;
    fi=fopen("exp.in","r");
    fo=fopen("exp.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;
}