Cod sursa(job #1963636)

Utilizator calin1Serban Calin calin1 Data 12 aprilie 2017 17:48:19
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

struct Nod
{
    int nr_aparitii, nr_copii;

    Nod *fii[30];

    Nod();
};

Nod::Nod()
{
    nr_aparitii = 0;
    nr_copii = 0;

    for(int i = 0 ; i <= 27 ; ++i)
    {
        fii[i] = NULL;
    }
}

int lungime;

char s[30];

bool scad;

int valoare(char c)
{
    return (c - 'a');
}

void add(Nod *&nod, int poz)
{
    if(poz == lungime)
    {
        nod->nr_aparitii++;

        return;
    }

    int poz_fiu = valoare(s[poz]);

    if(!nod->fii[poz_fiu])
    {
        nod->fii[poz_fiu] = new Nod;

        nod->nr_copii++;
    }

    add(nod->fii[poz_fiu], poz + 1);
}

int destroy(Nod *&nod, int poz)
{
    if(poz == lungime)
    {
        nod->nr_aparitii--;

        if(!nod->nr_aparitii && !nod->nr_copii)
        {
            delete nod;

            nod = NULL;

            return 1;
        }

        return 0;
    }

    int poz_fiu = valoare(s[poz]);

    if(destroy(nod->fii[poz_fiu], poz + 1))
    {
        if(!nod->nr_aparitii && !nod->nr_copii)
        {
            delete nod;

            nod = NULL;
        }
        else
        {
            if(scad == true)
            {
                nod->nr_copii--;

                scad = false;
            }
        }
    }
}

void afisare(Nod *nod, int poz)
{
    if(poz == lungime)
    {
        printf("%d\n", nod->nr_aparitii);

        return;
    }

    int poz_fiu = valoare(s[poz]);

    afisare(nod->fii[poz_fiu], poz + 1);
}

void prefix(Nod *nod, int poz)
{
    int poz_fiu = valoare(s[poz]);

    if(!nod->fii[poz_fiu])
    {
        printf("%d\n", poz);

        return;
    }

    prefix(nod->fii[poz_fiu], poz + 1);
}

void citire()
{
    int operatie;

    Nod *root = new Nod;

    while(!feof(stdin))
    {
        scanf("%d %s\n", &operatie, &s);

        lungime = strlen(s);

        scad = true;

        switch (operatie)
        {
            case 0: add(root, 0); break;
            case 1: destroy(root, 0); break;
            case 2: afisare(root, 0); break;
            case 3: prefix(root, 0); break;
        }
    }
}

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

    citire();

    return 0;
}