Cod sursa(job #2089082)

Utilizator anisca22Ana Baltaretu anisca22 Data 16 decembrie 2017 10:49:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <bits/stdc++.h>
#define SIZZ 26
#define SMAX 25
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct TRIE
{
    int kidz, terminal;
    TRIE *son[SIZZ];
    TRIE()
    {
        kidz = terminal = 0;
        memset(son, 0, sizeof(son));
    }
};

TRIE *root = new TRIE();

void add_word(TRIE *nod, char *poz)
{
    if (*poz == NULL)
    {
        nod -> terminal++;
        return;
    }
    int nxt = *poz - 'a';
    if (nod -> son[nxt] == NULL)
    {
        nod -> son[nxt] = new TRIE();
        nod -> kidz++;
    }
    add_word(nod -> son[nxt], poz + 1);
}

bool erase_word(TRIE *nod, char *poz)
{
    if (*poz == NULL)
    {
        nod -> terminal--;
        if (nod -> terminal == 0 && nod -> kidz == 0 && nod != root)
        {
            delete nod;
            return 1;
        }
        return 0;
    }
    int nxt = *poz - 'a';
    if (erase_word(nod -> son[nxt], poz + 1))
    {
        nod -> kidz--;
        nod -> son[nxt] = 0;
        if (nod -> terminal == 0 && nod -> kidz == 0 && nod != root)
        {
            delete nod;
            return 1;
        }
    }
    return 0;
}

int frecventa(TRIE *nod, char *poz)
{
    if (*poz == NULL)
        return nod -> terminal;
    int nxt = *poz - 'a';
    if (nod -> son[nxt] == NULL)
        return 0;
    frecventa(nod -> son[nxt], poz + 1);
}

int prefix(TRIE *nod, char *poz)
{
    if (*poz == NULL)
        return 0;
    int nxt = *poz - 'a';
    if (nod -> son[nxt] == NULL)
        return 0;
    return prefix(nod -> son[nxt], poz + 1) + 1;
}

int main()
{
    int op;
    char s[SMAX];
    while (fin >> op >> s)
    {
        if (op == 0)
            add_word(root, s);
        if (op == 1)
            erase_word(root, s);
        if (op == 2)
            fout << frecventa(root, s) << "\n";
        if (op == 3)
            fout << prefix(root, s) << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}