Cod sursa(job #2187041)

Utilizator ciprianprohozescuProhozescu Ciprian ciprianprohozescu Data 26 martie 2018 10:11:18
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <cstring>

using namespace std;

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

struct trie
{
    int nr, nrfii;
    trie *fiu[26];

    trie()
    {
        nr = nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};

trie *t = new trie;

void inserare(trie *nod, char *s);
bool stergere(trie *nod, char *s);
int numarare(trie *nod, char *s);
int lungime_prefix(trie *nod, char *s, int k);

int main()
{
    char sir[35];
    while (fin.getline(sir, 30))
    {
        switch(sir[0])
        {
            case '0': inserare(t, sir + 2); break;
            case '1': stergere(t, sir + 2); break;
            case '2': fout << numarare(t, sir + 2) << '\n'; break;
            case '3': fout << lungime_prefix(t, sir + 2, 0) << '\n'; break;
        }
    }
    fout.close();
    return 0;
}

void inserare(trie *nod, char *s)
{
    if (*s == 0)
    {
        nod->nr++;
        return ;
    }
    if (nod->fiu[*s - 'a'] == 0)
    {
        nod->fiu[*s - 'a'] = new trie;
        nod->nrfii++;
    }
    inserare(nod->fiu[*s - 'a'], s + 1);
}
bool stergere(trie *nod, char *s)
{
    if (*s == 0)
        nod->nr--;
    else if (stergere(nod->fiu[*s - 'a'], s + 1))
    {
        nod->fiu[*s - 'a'] = 0;
        nod->nrfii--;
    }
    if (nod->nr == 0 && nod->nrfii == 0 && nod != t)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int numarare(trie *nod, char *s)
{
    if (*s == 0)
        return nod->nr;
    if (nod->fiu[*s - 'a'])
        return numarare(nod->fiu[*s - 'a'], s + 1);
    return 0;
}
int lungime_prefix(trie *nod, char *s, int k)
{
    if (*s == 0 || nod->fiu[*s - 'a'] == 0)
        return k;
    return lungime_prefix(nod->fiu[*s - 'a'], s + 1, k + 1);
}