Pagini recente » Cod sursa (job #1471060) | Cod sursa (job #1482774) | Cod sursa (job #2765862) | Cod sursa (job #1069111) | Cod sursa (job #1044819)
#include <cstdio>
#include <cstring>
#include <unordered_map>
using namespace std;
struct TrieNode {
int words, appearances;
unordered_map <char, TrieNode *> letters;
};
TrieNode *trie;
void trie_insert(char * w) {
TrieNode * temp_trie = trie;
for (int i = 0; w[i]; i++) {
char ch = w[i];
if (temp_trie->letters.find(ch) != temp_trie->letters.end()) {
temp_trie = temp_trie->letters[ch];
temp_trie->appearances += 1;
}
else {
temp_trie->letters[ch] = new TrieNode;
temp_trie->letters[ch]->words = 0;
temp_trie->letters[ch]->appearances = 1;
temp_trie = temp_trie->letters[ch];
}
}
temp_trie->words += 1;
}
void trie_remove(char * w) {
TrieNode * temp_trie = trie, *parent;
for (int i = 0; w[i]; i++) {
char ch = w[i];
parent = temp_trie;
temp_trie = temp_trie->letters[ch];
temp_trie->appearances -= 1;
}
temp_trie->words -= 1;
}
void trie_print(char * w) {
TrieNode * temp_trie = trie;
for (int i = 0; w[i]; i++) {
char ch = w[i];
if (temp_trie->letters.find(ch) != temp_trie->letters.end() && temp_trie->letters[ch]->appearances > 0) {
temp_trie = temp_trie->letters[ch];
} else {
printf ("0\n");
return ;
}
}
printf ("%d\n", temp_trie->words);
}
void trie_prefix(char * w) {
TrieNode * temp_trie = trie;
int prefix_length = 0;
for (int i = 0; w[i]; i++) {
char ch = w[i];
if (temp_trie->letters.find(ch) == temp_trie->letters.end() || temp_trie->letters[ch]->appearances == 0) {
printf ("%d\n", prefix_length);
return ;
} else {
prefix_length += 1;
temp_trie = temp_trie->letters[ch];
}
}
printf ("%d\n", strlen(w));
}
int main() {
int command;
char w[21];
freopen ("trie.in", "r", stdin), freopen ("trie.out", "w", stdout);
trie = new TrieNode;
trie->words = 0;
while (scanf ("%d %s", &command, w) != EOF) {
if (command == 0) trie_insert(w);
else if (command == 1) trie_remove(w);
else if (command == 2) trie_print(w);
else if (command == 3) trie_prefix(w);
}
return 0;
}