Cod sursa(job #1403574)

Utilizator Toast97Calin Farcas Toast97 Data 27 martie 2015 13:47:53
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.81 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f ("trie.in");
ofstream g ("trie.out");

struct trie
{
    int aparitii;
    trie *muchii[30];
} *t;

void initializare (trie *&x)
{
    x = new trie;

    x -> aparitii = 0;

    for (int i = 1; i <= 26; i ++)
        x -> muchii[i] = NULL;
}

void creare_muchie (trie *x, int y)
{
    trie *c;

    initializare (c);

    x -> muchii[y] = c;
}

void adauga_cuvant (trie *x, char cuvant[23])
{
    trie *curent = x;

    int l = strlen (cuvant);
    int primul;

    for (int i = 0; i < l; i ++)
    {
        primul = int (cuvant[i] - 96);

        if (curent -> muchii[primul])
        {
            curent = curent -> muchii[primul];

            if (i == l - 1)
                ++ curent -> aparitii;
        }

        else
        {
            creare_muchie (curent, primul);
            curent = curent -> muchii[primul];

            if (i == l - 1)
                ++ curent -> aparitii;
        }
    }
}

void sterge_trie (trie *&x)
{
    delete x;
}

void sterge_cuvant (char cuvant[23])
{
    trie *curent = t, *secund;
    int primul;
    int l = strlen (cuvant);

    for (int i = 0; i < l; i ++)
    {
        primul = int (cuvant[i] - 96);

        secund = curent;
        curent = curent -> muchii[primul];
    }

    -- curent -> aparitii;
    secund -> muchii[primul] = 0;

    if (! curent -> aparitii)
        for (int i = 1; i <= 26; i ++)
           if (curent -> muchii[i])
                return;

    sterge_trie (curent);
}

int nr_ap (char cuvant[23])
{
    trie *curent = t;
    int primul;
    int l = strlen (cuvant);
    bool ok = 1;

    for (int i = 0; i < l; i ++)
    {
        primul = int (cuvant[i] - 96);

        if (curent -> muchii[primul])
            curent = curent -> muchii[primul];

        else
        {
            ok = 0;
            break;
        }
    }

    if (! ok)
        return 0;

    return curent -> aparitii;
}

int prefix (char cuvant[23])
{
    trie *curent = t;
    int primul, i;
    int l = strlen (cuvant);

    for (i = 0; i < l; i ++)
    {
        primul = int (cuvant[i] - 96);

        if (! curent -> muchii[primul])
            break;

        curent = curent -> muchii[primul];
    }

    return i;
}

void rezolvare ()
{
    int tip;
    char cuvant[23];

    while (f >> tip >> cuvant)
    {
        if (! tip)
            adauga_cuvant (t, cuvant);

        else if (tip == 1)
            sterge_cuvant (cuvant);

        else if (tip == 2)
            g << nr_ap (cuvant) << '\n';

        else
            g << prefix (cuvant) << '\n';
    }
}

int main()
{
    initializare (t);

    rezolvare ();

    f.close ();
    g.close ();
    return 0;
}