Pagini recente » Cod sursa (job #832727) | Cod sursa (job #804404) | Cod sursa (job #921525) | Cod sursa (job #716465) | Cod sursa (job #2924634)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
const int SIGMA = 26;
struct Node{
int freq = 0, fullWords = 0;
vector <Node*> v;
Node() : v(SIGMA, nullptr) {}
};
struct Trie {
private:
Node* root_ = nullptr;
Node* insert_ (char *s, Node *node);
Node* erase_ (char *s, Node *node);
int query_(char *s, Node *node);
int prefix_(char *s, Node *node);
public:
void insert (char *s) { root_ = insert_(s, root_); }
void erase (char *s) { root_ = erase_(s, root_); }
int query (char *s) { return query_(s, root_); }
int prefix (char *s) { return prefix_(s, root_); }
};
Trie trie;
Node* Trie::insert_ (char *s, Node *node) {
if (node == nullptr)
node = new Node();
++node->freq;
if (s[0] == '\0')
++node->fullWords;
else
node->v[s[0] - 'a'] = insert_(s + 1, node->v[s[0] - 'a']);
return node;
}
Node* Trie::erase_ (char *s, Node *node) {
if (node == nullptr)
return node;
--node->freq;
if (s[0] == '\0')
--node->fullWords;
else
node->v[s[0] - 'a'] = erase_ (s + 1, node->v[s[0] - 'a']);
if (node->freq == 0) {
delete node;
node = nullptr;
}
return node;
}
int query_ (char *s, Node *node) {
if (node == nullptr)
return 0;
if (s[0] == '\0')
return node->fullWords;
return query_(s + 1, node->v[s[0] - 'a']);
}
int prefix_ (char *s, Node *node) {
if (node == nullptr || s[0] == '\0')
return 0;
if (node->v[s[0] - 'a'] == nullptr)
return 0;
return 1 + prefix_ (s + 1, node->v[s[0] - 'a']);
}
int main() {
int op;
char s[50];
while (fin >> op >> s) {
if (op == 0)
trie.insert(s);
else if(op == 1)
trie.erase(s);
else if (op == 2)
cout << trie.query(s) << "\n";
else
cout << trie.prefix(s) << "\n";
}
return 0;
}