Cod sursa(job #1812812)

Utilizator EpictetStamatin Cristian Epictet Data 22 noiembrie 2016 14:09:02
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <cstring>

using namespace std;

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

class Trie
{
    public :
        int val, nr_fii;
        Trie *fiu[ 26 ];
    Trie()
    {
        val = nr_fii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};

char line[32];
Trie *T = new Trie;

void Ins(Trie *nod, char *s)
{
    if (*s == '\0')
    {
        nod->val += 1;
        return;
    }

    if (nod->fiu[*s - 'a'] == '\0')
    {
        nod->fiu[*s - 'a'] = new Trie;
        nod->nr_fii += 1;
    }

    Ins(nod->fiu[*s - 'a'], s + 1);
}

bool Del(Trie *nod, char *s)
{
    if (*s == '\0')
    {
        nod->val -= 1;
    }
    else if (Del(nod->fiu[*s - 'a'], s + 1))
    {
        nod->fiu[*s - 'a'] = '\0';
        nod->nr_fii -= 1;
    }

    if (nod->val == 0 && nod->nr_fii == 0 && nod != T)
    {
        delete nod;
        return true;
    }

    return false;
}

int Nr_Ap(Trie *nod, char *s)
{
    if (*s == '\0')
    {
        return nod->val;
    }

    if (nod->fiu[*s - 'a'] != '\0')
    {
        return Nr_Ap(nod->fiu[*s - 'a'], s + 1);
    }

    return 0;
}

int Max_Pref(Trie *nod, char *s, int k)
{
    if (*s == '\0' || nod->fiu[*s - 'a'] == '\0')
    {
        return k;
    }

    return Max_Pref(nod->fiu[*s - 'a'], s + 1, k + 1);
}

int main()
{
    while(fin.get(line, 30, '\n'))
    {
        switch (line[0])
        {
            case '0' :
            {
                Ins(T, line + 2);
                break;
            }
            case '1' :
            {
                Del(T, line + 2);
                break;
            }
            case '2' :
            {
                fout << Nr_Ap(T, line + 2) << '\n';
                break;
            }
            case '3' :
            {
                fout << Max_Pref(T, line + 2, 0) << '\n';
                break;
            }
        }
        fin.get();
    }

    fout.close();
    return 0;
}