Cod sursa(job #2720525)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 10 martie 2021 22:20:16
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

struct Trie
{
    int word, nrFii;
    Trie *fiu[26];

    Trie()
    {
        word = 0;
        nrFii = 0;
        memset(fiu, 0, sizeof fiu);
    }
};

int q;
char s[30];
Trie* T = new Trie;

void add(Trie *node, char *s)
{
    int x = *s - 'a';

    if(*s == '\0')
    {
        node -> word++;
        return;
    }

    if(node -> fiu[x] == nullptr)
    {
        node -> nrFii++;
        node -> fiu[x] = new Trie;
    }

    add(node -> fiu[x], s + 1);
}

bool del(Trie *node, char *s)
{
    int x = *s - 'a';

    //cout << *s << ' ';

    if(*s == '\0')
        node -> word--;
    else if(node -> fiu[x] != nullptr && del(node -> fiu[x], s + 1))
    {
        node -> nrFii--;
        node -> fiu[x] = nullptr;
    }

    if(node != T && node -> word == 0 && node -> nrFii == 0)
    {
        delete node;
        return true;
    }

    return false;
}

int cuv(Trie *node, char *s)
{
    int x = *s - 'a';

    //cout << *s << ' ';

    if(*s == '\0')
        return node -> word;

    if(node -> fiu[x] == nullptr)
        return 0;

    return cuv(node -> fiu[x], s + 1);
}

int pre(Trie *node, char *s)
{
    int x = *s - 'a';

    //cout << *s << '\n';

    if(*s == '\0')
        return 0;

    if(node -> fiu[x] == nullptr)
        return 0;

    return pre(node -> fiu[x], s + 1) + 1;
}

int main()
{
    while(in >> q >> s)
    {
        switch(q)
        {
        case 0:
            add(T, s);
            break;
        case 1:
            del(T, s);
            break;
        case 2:
            out << cuv(T, s) << '\n';
            break;
        case 3:
            out << pre(T, s) << '\n';
            break;
        default:
            break;
        }

        memset(s, 0, sizeof s);
    }

    return 0;
}