Pagini recente » Cod sursa (job #1374649) | Cod sursa (job #293380) | Cod sursa (job #637844) | Cod sursa (job #1122431) | Cod sursa (job #2987524)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct TrieNode {
int counter;
int is_in_words;
TrieNode *children[30];
TrieNode() {
counter = 0;
is_in_words = 0;
for(char c = 'a'; c <= 'z'; c ++) {
children[c - 'a'] = NULL;
}
}
};
void increase(TrieNode *root, string word) {
TrieNode *node = root;
for(char c : word) {
if(node->children[c - 'a'] == NULL) {
node->children[c - 'a'] = new TrieNode();
}
node = node->children[c - 'a'];
node->is_in_words ++;
}
node->counter ++;
}
void decrease(TrieNode *root, string word) {
TrieNode *node = root;
for(char c : word) {
if(node->children[c - 'a'] == NULL) {
return;
}
node = node->children[c - 'a'];
node->is_in_words --;
}
if(node->counter > 0)
node->counter --;
}
int search(TrieNode *root, string word) {
TrieNode *node = root;
for(char c : word) {
if(node->children[c - 'a'] == NULL) {
return 0;
}
node = node->children[c - 'a'];
}
return node->counter;
}
int maxPrefixWord(TrieNode *root, string word) {
TrieNode *node = root;
int current_size = 0, maximum = 0;
for(auto c : word) {
if(node->children[c - 'a'] == NULL) {
return maximum;
}
node = node->children[c - 'a'];
current_size ++;
if(node->is_in_words > 0)
maximum = current_size;
}
return maximum;
}
int main()
{
TrieNode *root = new TrieNode();
int query;
while(in >> query) {
string word;
in >> word;
if(query == 0) {
increase(root, word);
} else if(query == 1) {
decrease(root, word);
} else if(query == 2) {
out << search(root, word) << '\n';
} else {
out << maxPrefixWord(root, word) << '\n';
}
}
return 0;
}