Pagini recente » Cod sursa (job #2273767) | Cod sursa (job #644422) | Cod sursa (job #2945634) | Cod sursa (job #2505488) | Cod sursa (job #1044811)
#include <fstream>
#include <iostream>
#include <cstring>
#include <unordered_map>
using namespace std;
struct TrieNode {
int words, appearances;
unordered_map <char, TrieNode *> letters;
};
TrieNode *trie;
ifstream fin("trie.in");
ofstream fout("trie.out");
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 {
fout << "0\n";
return ;
}
}
fout << temp_trie->words << "\n";
}
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) {
fout << prefix_length << "\n";
return ;
} else {
prefix_length += 1;
temp_trie = temp_trie->letters[ch];
}
}
fout << strlen(w) << "\n";
}
int main() {
int command;
char w[21];
trie = new TrieNode;
trie->words = 0;
while (fin >> command >> w) {
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;
}