Cod sursa(job #1921199)

Utilizator roxanastRoxana Stiuca roxanast Data 10 martie 2017 11:43:43
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <cstring>
using namespace std;
int op;
char sir[25];
ifstream f("trie.in");
ofstream g("trie.out");
struct nod{
    int nrp,nrc;
    nod* fii[26];
    nod(){
        nrp=nrc=0;
        for(int i=0;i<26;++i)
            fii[i]=NULL;
    }
};
nod* t=new nod;

nod* adauga(nod* p,char *s){
    if(p==NULL)
        p=new nod;
    p->nrp++;
    if(s[0]==0){
        p->nrc++;
        return p;
    }
    p->fii[s[0]-'a']=adauga(p->fii[s[0]-'a'],s+1);
    return p;
}
nod* sterge(nod* p,char *s){
    p->nrp--;
    if(s[0]==NULL) {
        p->nrc--;
        //return p;
    }else
        p->fii[s[0]-'a']=sterge(p->fii[s[0]-'a'],s+1);
    if(p->nrp==0 && p->nrc == 0 && p != t){
        delete p;
        p=NULL;
    }
    return p;
}

int nrapar(nod* p,char *s){
    if(p==NULL)
        return 0;
    if(s[0]==0)
        return p->nrc;
    return nrapar(p->fii[s[0]-'a'],s+1);
}
int lungpref(nod* p,char *s){
    if(p==NULL||s[0]==NULL)
        return 0;
    return 1+lungpref(p->fii[s[0]-'a'],s+1);
}
int main()
{
    while(f>>op){
        f.get();
        f.get(sir,21);
        if(op==0)   t=adauga(t,sir);
        if(op==1)   t=sterge(t,sir);
        if(op==2)   g<<nrapar(t,sir)<<'\n';
        if(op==3)   g<<lungpref(t,sir)-1<<'\n';
    }
    return 0;
}