Cod sursa(job #2075087)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 25 noiembrie 2017 11:20:25
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <cstdio>
#include <cstring>

using namespace std;

char cuv[30];
int lg, m;

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

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

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

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

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

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);

    r=new nod();
    while(fgets(cuv, 30, stdin))
    {
        cuv[strlen(cuv)-1]='\0';
        m++;
        lg=strlen(cuv);
        switch(cuv[0]-'0')
        {
            case 0: adunare(r, 2); break;
            case 1: scadere(r, 2); break;
            case 2: printf("%d\n", nr_aparitii(r, 2)); break;
            case 3: printf("%d\n", lung_max(r, 2));
        }
    }
    return 0;
}