Cod sursa(job #2082852)

Utilizator luanastLuana Strimbeanu luanast Data 6 decembrie 2017 20:51:52
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");

struct trie{
    int fii;
    int ap;
    trie *f[26];
    trie(){
        ap=fii=0;
        for(int i=0;i<26;i++){
            f[i]=0;
        }
    }
};
trie *rad=new trie;
char s[23];

void adaugare(trie *&r, char *s){
    if(*s != NULL){
        if(r->f[*s-'a'] == NULL){
            r->fii++;
            r->f[*s-'a'] = new trie;
        }
        adaugare(r->f[*s-'a'],s+1);
    }
    else
        r->ap++;
}

int sterge(trie *&r, char *s){
    if (*s == NULL){
        r->ap--;
        if(r->fii == 0 && r->ap == 0){
            delete r;
            r=NULL;
            return 1;
        }
        else
            return 0;
    }
    int ok = sterge(r->f[*s-'a'],s+1);
    if(ok){
        r->fii--;
        r->f[*s-'a'] = NULL;
        if(r->ap==0 && r->fii==0 && r!=rad){
            delete r;
            r=NULL;
            return 1;
        }
    }
    return 0;

}

int nrap(trie *r, char *s){
    if(*s==NULL)
        return r->ap;
    if(r->f[*s-'a']==NULL)
        return 0;
    return nrap(r->f[*s-'a'],s+1);
}

void prefix(trie *r, char *s, int nivel){
    if(r->f[*s-'a']==NULL || *s==NULL)
        fout<<nivel<<"\n";
    else
        prefix(r->f[*s-'a'],s+1,nivel+1);

}

void deleteTrie(trie *&r){
    if(r!=NULL)
        for(int i=0;i<26;i++)
            deleteTrie(r->f[i]);
    else
        delete r;
}


int t;
int main(){
    while(fin>>t>>s){
        if(t==0){
            adaugare(rad,s);
        }
        if(t==1)
            sterge(rad,s);
        if(t==2)
            fout<<nrap(rad,s)<<"\n";
        if(t==3)
            prefix(rad,s,0);
    }
    deleteTrie(rad);
    delete rad;
    return 0;
}