Pagini recente » Profil AnDrEwBoY | template/meeting-under-construction | Fabrica | Istoria paginii utilizator/azinganga_ale | Cod sursa (job #3150668)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <unordered_map>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie {
int number, chld_nr;
unordered_map<char, Trie*> children;
Trie() {
number = chld_nr = 0;
}
};
Trie* T = new Trie;
void add(Trie* node, char* word) {
if(!isalpha(*word)) {
node->number++;
return;
}
if(!node->children.contains(*word)) {
node->chld_nr++;
node->children[*word] = new Trie;
}
add(node->children[*word], word + 1);
}
bool del(Trie* node, char* word) {
if(!isalpha(*word)) {
node->number--;
} else if(del(node->children[*word], word + 1)) {
node->chld_nr--;
node->children.erase(*word);
}
if(!node->chld_nr && !node->number && node != T) {
delete node;
return true;
}
return false;
}
int occurances(Trie* node, char *word) {
if(!isalpha(*word)) {
return node->number;
}
if(!node->children.contains(*word)) {
return 0;
}
return occurances(node->children[*word], word + 1);
}
int prefix(Trie* node, char *word, int len) {
if(!isalpha(*word) || !node->children.contains(*word)) {
return len;
}
return prefix(node->children[*word], word + 1, len + 1);
}
void solve() {
int x;
char word[21];
while(f>>x>>word) {
if(x == 0) {
add(T, word);
} else if(x == 1) {
del(T, word);
} else if(x == 2) {
g<<occurances(T, word) << '\n';
} else {
g<<prefix(T, word, 0) << '\n';
}
}
}
int main() {
solve();
return 0;
}