Cod sursa(job #2815556)

Utilizator competitive_submarinePetre Robert Cristian competitive_submarine Data 9 decembrie 2021 20:13:36
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

class Node
{
public:
    int nr_a = 0;
    int nr_c = 0;

    Node* fii[26] {NULL};
};

class Trie
{
    Node* root = nullptr;
public:

    void insert(char* s)
    {
        root = insert_(s, root);
    }

    void erase(char* s)
    {
        root = erase_(s, root);
    }

    int query_prefix(char* s)
    {
        return query_prefix_(s, root);
    }

    int query_cuvant(char* s)
    {
        return query_cuv_(s, root);
    }


private:
    int query_prefix_(char* s, Node* node);
    int query_cuv_(char* s, Node* node);
    Node* insert_(char* s, Node* node);
    Node* erase_(char* s, Node* node);
};

Node* Trie::insert_(char* s, Node* node)
{
    if(node == NULL)
    {
        node = new Node();
    }

    node->nr_a++;

    if(s[0] == NULL)
    {
        node->nr_c++;
    }
    else
    {
        node->fii[s[0] - 'a'] = insert_(s + 1, node->fii[s[0] - 'a']);
    }

    return node;
}

Node* Trie::erase_(char* s, Node* node)
{
    if(node == NULL)
    {
        return node;
    }

    node->nr_a--;

    if(s[0] == NULL)
    {
        node->nr_c--;
    }
    else
    {
        node->fii[s[0] - 'a'] = erase_(s + 1, node->fii[s[0] - 'a']);
    }

    if(node->nr_a == 0)
    {
        delete node;
        node = NULL;
    }
    return node;
}

int Trie::query_prefix_(char* s, Node* node)
{
    if(s[0] == NULL || node == NULL)
        return 0;

    if(node->fii[s[0] - 'a'] != NULL)
        return 1 + query_prefix_(s + 1, node->fii[s[0] - 'a']);

    return 0;
}

int Trie::query_cuv_(char* s, Node* node)
{
    if(node == NULL)
    {
        return 0;
    }
    else if(s[0] == NULL)
        return node->nr_c;
    else
        return query_cuv_(s + 1, node->fii[s[0] - 'a']);
}
char s[20];
int main()
{
    Trie arbore;
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    while(cin.getline(s, 20))
    {
        
        switch(s[0])
        {
            case '0':
                arbore.insert(s + 1);
                break;
            case '1':
                arbore.erase(s + 1);
                break;
            case '2':
                cout<<arbore.query_cuvant(s + 1)<<"\n";
                break;
            case '3':
                cout<<arbore.query_prefix(s + 1) - 1<<"\n";
                break;
        }
    }
}