Cod sursa(job #2507901)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 10 decembrie 2019 23:36:07
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct nod{
    int nr;
    int fii;
    nod *f[26];

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

nod *r;

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

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

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

int Cnt(nod *t, char *p){
    if(*p==0)
        return t->nr;

    if(t->f[*p-'a']==NULL)
        return 0;

    return Cnt(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 1+Prefix(t->f[*p-'a'],p+1);
}

int Delete(nod *&t, char *p){
    ///returneaza 1 daca sterge nodul si 0 in caz contrar

    if(*p==0){
        t->nr--;
        if(t->nr==0 && t->fii==0 && t!=r){
            delete t;
            t=0;
            return 1;
        }
        return 0;
    }

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

int t;
char s[20];

int main(){
    r=new nod;

    while(fin>>t){
        fin>>s;

        switch(t){
            case 0: Insert(r,s); break;
            case 1: Delete(r,s); break;
            case 2: fout<<Cnt(r,s)<<"\n"; break;
            case 3: fout<<Prefix(r,s)<<"\n"; break;
        }
    }

    return 0;
}