Pagini recente » Cod sursa (job #1212176) | Cod sursa (job #2639) | Cod sursa (job #2376395) | Cod sursa (job #901081) | Cod sursa (job #2814154)
#include <fstream>
#include <vector>
std::ifstream in("trie.in");
std::ofstream out("trie.out");
class Node{
public:
int nr_ap=0;
int nr_ends=0;
Node* fii[26] {nullptr};
};
class Trie{
Node* root = new Node;
public:
void insert(char *s){
root = insert_(s, root);
}
void erase(char *s){
root = erase_(s, root);
}
int query_prefix(char *s, Node* node);
int query_cuv(char *s, Node* node);
Node* get_root(){
return root;
}
private:
Node* insert_(char *s, Node* node);
Node* erase_(char *s, Node* node);
};
Node* Trie::insert_(char *s, Node* node){
if(node == nullptr){
node = new Node;
}
++node->nr_ap;
if(*s == '\0'){
++node->nr_ends;
return node;
}
else{
node->fii[*s - 'a'] = insert_(s+1, node->fii[*s - 'a']);
}
return node;
}
Node* Trie::erase_(char *s, Node* node){
if(node == nullptr){
return node;
}
node->nr_ap--;
if(*s == '\0'){
--node->nr_ends;
}
else{
node->fii[*s - 'a'] = erase_(s+1, node->fii[*s - 'a']);
}
if(node->nr_ap == 0){
delete node;
node = nullptr;
}
return node;
}
int Trie::query_prefix(char *s, Node* node){
if(*s == '\0' || node == nullptr || node->fii[*s - 'a'] == nullptr) return 0;
return query_prefix(s+1, node->fii[*s - 'a']) + 1;
}
int Trie::query_cuv(char *s, Node* node){
if(node == nullptr){
return 0;
}
else if(*s == '\0'){
return node->nr_ends;
}
else{
return query_cuv(s+1, node->fii[*s - 'a']);
}
}
Trie v;
char cuv[21];
int main()
{
int type;
while(true){
in >> type >> cuv;
if(in.eof()) break;
switch(type){
case 0:
v.insert(cuv);
break;
case 1:
v.erase(cuv);
break;
case 2:
out << v.query_cuv(cuv, v.get_root()) << '\n';
break;
case 3:
out << v.query_prefix(cuv, v.get_root()) << '\n';
break;
}
}
return 0;
}