Pagini recente » Cod sursa (job #641876) | Cod sursa (job #1716143) | Cod sursa (job #1461737) | Cod sursa (job #1291881) | Cod sursa (job #3042115)
#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;
}