Cod sursa(job #2517556)

Utilizator MihneaGhiraMihnea MihneaGhira Data 3 ianuarie 2020 18:44:58
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int op;
char s[20];
struct nod{
    int nr;
    int nr_fii;
    nod *f[26];

    nod(){
        nr=0;
        nr_fii=0;
        for(int i=0; i<26; i++)
            f[i]=NULL;
    }
} *point;

void inserare(nod *t,char *p){
    if(*p==0){
        t->nr++;
        return;
    }

    if(t->f[*p-'a']==NULL){
        t->f[*p-'a']=new nod;
        t->nr_fii++;
    }

    inserare(t->f[*p-'a'],p+1);
}

int aparitii(nod *t,char *p){
    if(*p==0){
        return t->nr;
    }
    if(t->f[*p-'a']==NULL){
        return 0;
    }
    return aparitii(t->f[*p-'a'],p+1);
}

int prefix(nod *t,char *p){
    if(*p==0){
        return 0;
    }
    if(t->f[*p-'a']==NULL){
        return 0;
    }
    return prefix(t->f[*p-'a'],p+1)+1;
}

int stergere(nod *&t,char *p){
    if(*p==0){
        t->nr--;
        if(t->nr==0 && t->nr_fii==0 && t!=point){
            delete t;
            t=0;
            return 1;
        }
        return 0;
    }

    if(stergere(t->f[*p-'a'],p+1)){
        t->nr_fii--;
        if(t->nr==0 && t->nr_fii==0 && t!=point){
            delete t;
            t=0;
            return 1;
        }
    }
    return 0;
}

int main(){
    point=new nod;
    while(fin>>op){
        fin>>s;
        if(op==0){
            inserare(point,s);
        }
        if(op==1){
            stergere(point,s);
        }
        if(op==2){
            fout<<aparitii(point,s)<<"\n";
        }
        if(op==3){
            fout<<prefix(point,s)<<"\n";
        }
    }

    return 0;
}