Cod sursa(job #1893681)

Utilizator GoogalAbabei Daniel Googal Data 25 februarie 2017 21:28:28
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <cstring>
#include <memory.h>

using namespace std;

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

struct Nod
{
    int nrc,nrp;
    Nod *fii[26];

    Nod()
    {
        nrc=nrp=0;
        memset(fii,0,sizeof(fii));
    }
};

int op;
char v[30],s[25];
Nod *nod= new Nod;

void adauga(Nod *p, char *s)
{
    if(*s==0)
    {
        p->nrc++;
        return;
    }

    if(p->fii[*s-'a']==0)
    {
        p->fii[*s-'a']=new Nod;
        p->nrp++;
    }
    adauga(p->fii[*s-'a'], s+1);
}

int delcuv(Nod *p,char *s)
{
    if(*s<'a')
        nod->nrc--;

    else if(delcuv(p->fii[*s-'a'],s+1)){
        nod->fii[*s-'a']=0;
        nod->nrp--;
    }

    if(p->nrc==0 && p->nrp==0 && p!=nod)
    {
        delete p;
        return 1;
    }
    return 0;
}

int apcuv(Nod *p, char *s)
{
    if(*s<'a')
    {
        return p->nrc;
    }

    if(p->fii[*s-'a'])
    {
        return apcuv(p->fii[*s-'a'],s+1);
    }
    return 0;
}

int prefix(Nod *p, char *s,int k)
{
    if(*s<'a' || p==0 ||p->fii[*s-'a']==0)
        return k;
    return prefix(nod->fii[*s-'a'],s+1,k+1);
}

int main()
{
    while(fin.getline(v,30))
    {
        op=v[0]-'0';
        if(op==0)
            adauga(nod,v+2);
        else if(op==1)
            delcuv(nod,v+2);
        else if(op==2)
            fout<<apcuv(nod,v+2)<<'\n';
        else
            fout<<prefix(nod,v+2,0)<<'\n';
    }
    return 0;
}