Cod sursa(job #2266685)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 22 octombrie 2018 20:34:19
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <cstdio>
#include <cstring>
#define MAXLIT 21
FILE*fi,*fout;
char str[MAXLIT];
struct Trie{
    int con,nrfii;
    Trie *fii[26];
    Trie(){
       con=nrfii=0;
       memset(fii,0,sizeof(fii));
    }
};
Trie *T = new Trie;
void insert(Trie *nod,char *s){
     if((*s)>=0&&(*s)<26){
         if(nod->fii[*s]==0){
            nod->nrfii++;
            nod->fii[*s]=new Trie;
         }
         insert(nod->fii[*s],s+1);
     }
     else
        nod->con++;
}
int flag;
void del(Trie *nod,char *s){
    if((*s)>=0&&(*s)<26){
        del(nod->fii[*s],s+1);
        if(flag==1)
           nod->nrfii--;
        if(nod->nrfii==0&&flag==1&&nod!=T&&nod->con==0)
            delete nod;
        else{
            if(flag==1)
               nod->fii[*s]=0;
            flag=0;
        }
    }
    else{
        nod->con--;
        if(nod->nrfii==0&&nod->con==0&&nod!=T){
           flag=1;
           delete nod;
        }
    }
}
int print_word(Trie *nod,char *s,int niv){
    if((*s)>=0&&(*s)<26){
        if(nod->fii[*s]==0)
           return 0;
        return print_word(nod->fii[*s],s+1,niv+1);
    }
    else
        return nod->con;
}
int print_prefix(Trie *nod,char *s,int niv){
    if((*s)==-1||nod->fii[*s]==0)
        return niv;
    else
        return print_prefix(nod->fii[*s],s+1,niv+1);
}
int main(){
    int n;
    char a,t;
    fi=fopen("trie.in" ,"r");
    fout=fopen("trie.out" ,"w");
    a=fgetc(fi);
    while(a!=EOF){
        t=a;
        a=fgetc(fi);
        a=fgetc(fi);
        n=0;
        while(a>='a'&&a<='z'){
           str[n++]=a-'a';
           a=fgetc(fi);
        }
        a=fgetc(fi);
        t-='0';
        str[n]=-1;
        if(t==0)
            insert(T,str);
        if(t==1){
            flag=0;
            del(T,str);
        }
        if(t==2)
            fprintf(fout,"%d\n" ,print_word(T,str,0));
        if(t==3)
            fprintf(fout,"%d\n" ,print_prefix(T,str,0));
    }
    fclose(fi);
    fclose(fout);
    return 0;
}