Cod sursa(job #2075097)

Utilizator patricia.predaPatricia Preda patricia.preda Data 25 noiembrie 2017 11:23:16
Problema Trie Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char cuv[30],l;
int lg;

struct nod
{
    int nr, fii;
    nod *lit[30];
    nod()
    {
        for(int i=0; i<27; ++i)
            lit[i]=0;
        nr=0;
        fii=0;
    }
}*r;

void adaug(nod *v, int j)
{

    if(j==lg)
    {
        v->nr++;
        return;
    }
    if(v->lit[cuv[j]-'a']==NULL)
    {
        v->lit[cuv[j]-'a']=new nod();
        v->fii++;
    }
    adaug(v->lit[cuv[j]-'a'], j+1);
}

int sterg(nod *v, int j)
{
    if(j==lg)
        v->nr--;
    else if(sterg(v->lit[cuv[j]-'a'], j+1))
    {
        v->fii--;
        v->lit[cuv[j]-'a']=0;
        //return 0;
    }
    if(v->nr==0 && v->fii==0 && r!=v)
    {
        delete v;
        return 1;
    }
    return 0;
}

void aparitii(nod *v, int j)
{
    if(j==lg)
    {
        printf("%d\n", v->nr);
        return;
    }
    if(v->lit[cuv[j]-'a']==NULL)
    {
        printf("0\n");
        return ;
    }
    aparitii(v->lit[cuv[j]-'a'], j+1);
}

int lg_prefix(nod *v, int j)
{
    if(v== NULL)
        return j-3;
    return lg_prefix(v->lit[cuv[j]-'a'],j+1);
}

void citire()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    r=new nod;
    while(fgets(cuv,30,stdin))
    {
        lg=strlen(cuv)-1;
        switch(cuv[0]-'0')
        {
        case 0:
            adaug(r,2);
            break;
        case 1:
            sterg(r,2);
            break;
        case 2:
            aparitii(r,2);
            break;
        case 3:
            printf("%d\n", lg_prefix(r,2));
            break;
        }
    }
}

int main()
{
    citire();
    return 0;
}