Cod sursa(job #1355507)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 22 februarie 2015 19:32:28
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <cstring>

using namespace std;

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

struct Trie
{
    int inf , nrfii;
    Trie *fiu[30];

    Trie()
    {
        inf = nrfii = 0;

        for (int i = 'a' - 'a'; i <= 'z' - 'a'; ++i)
            fiu[i] = NULL;
    }
};

Trie *T = new Trie;

int tip;

char cuvant[25];

void insert(Trie *T , char *s)
{
    if (strlen(s) == 0)
    {
        T -> inf++;
        return;
    }

    if (T -> fiu[*s - 'a'] == NULL)
    {
        T -> nrfii++;
        T -> fiu[*s - 'a'] = new Trie;
    }

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

void erase(Trie *T , char *s)
{
    if (strlen(s) == 0)
    {
        T -> inf--;
        return;
    }

    erase(T -> fiu[*s - 'a'], s + 1);

    if (T -> fiu[*s - 'a'] -> inf == 0 && T -> fiu[*s - 'a'] -> nrfii == 0)
    {
        T -> fiu[*s - 'a'] = NULL;
        T -> nrfii --;
    }
}

int numar_aparitii(Trie *T , char *s)
{
    if (T == NULL) return 0;

    if (strlen(s) == 0) return T -> inf;

    return numar_aparitii(T -> fiu[*s - 'a'] , s + 1);
}

int longest_prefix(Trie *T , char *s)
{
    if (strlen(s) == 0 || T -> fiu[*s - 'a'] == NULL) return strlen(s);

    return longest_prefix(T -> fiu[*s - 'a'] , s + 1);

}

int main()
{
    while (f >> tip)
    {
        f >> cuvant;

        if (tip == 0) insert(T , cuvant);
        if (tip == 1) erase(T , cuvant);
        if (tip == 2) g << numar_aparitii(T , cuvant) << '\n';
        if (tip == 3) g << strlen(cuvant) - longest_prefix(T , cuvant) << '\n';
    }

    return 0;
}