Pagini recente » Istoria paginii utilizator/aurstar | Cod sursa (job #2483057) | Cod sursa (job #3139737)
#include <fstream>
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
struct Node {
int cnt_node, cnt_subtree;
Node* children[26];
Node() : cnt_node(0), cnt_subtree(0), children{} {}
};
void insert(Node* node, const char* w) {
node->cnt_subtree += 1;
if (*w == '\0') {
node->cnt_node += 1;
return;
}
int c = *w - 'a';
if (node->children[c] == nullptr) {
node->children[c] = new Node();
}
insert(node->children[c], w + 1);
}
void erase(Node* node, const char* w) {
node->cnt_subtree -= 1;
if (*w == '\0') {
node->cnt_node -= 1;
return;
}
int c = *w - 'a';
erase(node->children[c], w + 1);
if (node->children[c]->cnt_subtree == 0) {
delete node->children[c];
node->children[c] = nullptr;
}
}
int cnt(Node* node, const char* w) {
if (*w == '\0') {
return node->cnt_node;
}
int c = *w - 'a';
if (node->children[c] == nullptr) {
return 0;
}
return cnt(node->children[c], w + 1);
}
int longest_common_prefix(Node* node, const char* w) {
if (*w == '\0') {
return 0;
}
int c = *w - 'a';
if (node->children[c] == nullptr) {
return 0;
}
return longest_common_prefix(node->children[c], w + 1) + 1;
}
int main() {
Node* root = new Node();
int op;
char w[25];
while (fin >> op >> w) {
switch (op) {
case 0:
insert(root, w);
break;
case 1:
erase(root, w);
break;
case 2:
fout << cnt(root, w) << "\n";
break;
case 3:
fout << longest_common_prefix(root, w) << "\n";
break;
}
}
return 0;
}