Cod sursa(job #1403468)

Utilizator dumitrualexAlex Dumitru dumitrualex Data 27 martie 2015 12:19:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

struct nod
{
    nod * fii['z'-'a'+1];
    int inf, nr_fii;

    nod()
    {
        inf = nr_fii = 0;
        memset(fii, 0, sizeof(fii));
    }
} * radacina;

char a[100];


void adaugare(nod * n, char * a)
{
    if (*a == 0)
        n->inf++;
    else
    {
        if (!n->fii[*a-'a'])
        {
            n->fii[*a-'a'] = new nod();
            n->nr_fii++;
        }

        adaugare(n->fii[*a-'a'], a+1);
    }
}

bool stergere(nod * n, char * a)
{
    if (*a == 0)
        n->inf--;
    else
    {
        if (stergere(n->fii[*a-'a'], a+1))
            {
                n->fii[*a-'a'] = 0;
                n->nr_fii--;
            }
    }

    if (n->inf == 0 && n->nr_fii == 0 && n != radacina)
    {
        delete n;
        return 1;
    }

    return 0;
}

int nr_aparitii(nod * n, char * a)
{
    if (*a == 0)
        return n->inf;
    else if (n->fii[*a-'a'])
        return nr_aparitii(n->fii[*a-'a'], a+1);
    else
        return 0;
}


int max_prefix(nod * n, char * a)
{
    if (*a == 0)
        return 0;
    else if (n->fii[*a-'a'])
        return 1 + max_prefix(n->fii[*a-'a'], a+1);
    else
        return 0;
}


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

    radacina = new nod;
    while (!feof(stdin))
    {
        gets(a);
        scanf("\n");

        switch (a[0])
        {
            case '0':
                adaugare(radacina, a+2);
                break;
            case '1':
                stergere(radacina, a+2);
                break;
            case '2':
                printf("%d\n", nr_aparitii(radacina, a+2));
                break;
            case '3':
                printf("%d\n", max_prefix(radacina, a+2));
                break;
        }

    }
    return 0;
}