Cod sursa(job #1947969)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 31 martie 2017 16:02:04
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <cstring>

using namespace std;

char cuv[30];

struct nod
{
    int nr, fii;
    nod *lit[30];
}*v;

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

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

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

void lung_max(nod *v, int j)
{
    if(j==strlen(cuv)-1)
          return;
    if(v->lit[cuv[j]-'0'])
    {
        lung_max(v->lit[cuv[j]-'0'], j+1);
        return;
    }
    printf("%d\n", j-2);
    return;
}

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

    while(fgets(cuv, 30, stdin))
    {
        cuv[strlen(cuv)-1]='\0';
        switch(cuv[0]-'0')
        {
            case 0: adunare(v, 2);
            case 1: scadere(v, 2);
            case 2: nr_aparitii(v, 2);
            case 3: lung_max(v, 2);
        }
    }
    return 0;
}