Cod sursa(job #3042115)

Utilizator MarutBrabete Marius Stelian Marut Data 3 aprilie 2023 22:26:45
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include<bits/stdc++.h>
using namespace std;
struct Node
{
    vector<Node*>children;
	int nr_cuv = 0;
	int nr_ap = 0;
	Node() : children(26) {}
};

class Trie
{

public:
	void insert(string s) { root_ = insert_(root_, s.c_str()); }
	void erase(string s) { root_ = erase_(root_, s.c_str()); }
	int query_prefix(string s) { return query_prefix_(root_, s.c_str()); }
	int query_word(string s) { return query_word_(root_, s.c_str()); }

private:
	Node* root_ = nullptr;

	Node* insert_(Node* node, const char* s);
	Node* erase_(Node* node, const char* s);
	int query_word_(Node* node, const char* s);
	int query_prefix_(Node* node, const char* s);
};

Node* Trie::insert_(Node* node, const char* s)
{
	if(node == nullptr) node = new Node;
	node->nr_ap++;
	if (s[0] == '\0') node->nr_cuv++;
        else node->children[s[0] - 'a'] = insert_(node->children[s[0] - 'a'], s + 1);
	return node;
}
Node* Trie::erase_(Node* node, const char* s)
{
	if (node == nullptr) return node;
	if (s[0] == '\0') node->nr_cuv--;
        else node->children[s[0] - 'a'] = erase_(node->children[s[0] - 'a'], s + 1);
	node->nr_ap--;
	if(node->nr_ap == 0)
    {
		delete node;
		node = nullptr;
	}

	return node;
}

int Trie::query_word_(Node* node, const char* s)
{
	if (node == nullptr) return 0;
	if (s[0] == '\0') return node->nr_cuv;
        else return query_word_(node->children[s[0] - 'a'], s + 1);
}

int Trie::query_prefix_(Node* node, const char* s)
{
	if (node == nullptr || s[0] == '\0') return 0;
	if (node->children[s[0] - 'a'] == nullptr) return 0;
        else return 1 + query_prefix_(node->children[s[0] - 'a'], s + 1);
}

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	Trie trie;
	int op;
	string s;
	while(getline(cin,s))
    {
        op=s[0]-'0';
        s=string(s.begin()+2,s.end());
		if(op==0) trie.insert(s);
            else if (op == 1) trie.erase(s);
                else if (op == 2) printf("%d\n",trie.query_word(s));
                    else printf("%d\n",trie.query_prefix(s));;
	}

	return 0;
}