Pagini recente » Cod sursa (job #2519313) | Cod sursa (job #1736936) | Profil GrecuDianaSorina | Cod sursa (job #1153851) | Cod sursa (job #1211983)
#include <fstream>
#include <string>
using namespace std;
ifstream ifs("trie.in");
ofstream ofs("trie.out");
typedef struct TrieNode
{
int size; // The size of the subtree that starts from the current node
int words; // The number of words that end at this node
TrieNode* childs[32];
} TrieNode;
TrieNode* root;
int get_char_index(char c)
{
return c - 'a';
}
TrieNode* insert(TrieNode* node, string w, int l)
{
if (node == NULL) node = new TrieNode();
++node->size;
if (l == w.length())
{
++node->words;
}
else
{
int index = get_char_index(w[l]);
node->childs[index] = insert(node->childs[index], w, l+1);
}
return node;
}
void insert(string w)
{
root = insert(root, w, 0);
}
TrieNode* remove(TrieNode* node, string w, int l)
{
if (node == NULL) return NULL;
--node->size;
if (node->size == 0)
{
if (l < w.length())
{
int index = get_char_index(w[l]);
remove(node->childs[index], w, l+1);
}
delete node;
return NULL;
}
if (l == w.length())
{
--node->words;
}
else
{
int index = get_char_index(w[l]);
node->childs[index] = remove(node->childs[index], w, l+1);
}
return node;
}
void remove(string w)
{
root = remove(root, w, 0);
}
int get_number_of_occurences(string w)
{
TrieNode* node = root;
int l = 0
while (node != NULL)
{
if (l == w.length()) return node->words;
int index = get_char_index(w[l]);
node = node->childs[index];
}
return 0;
}
int get_longest_prefix_length(string w)
{
TrieNode* node = root;
int l = 0
while (node != NULL)
{
if (l == w.length()) return l;
int index = get_char_index(w[l]);
node = node->childs[index];
}
return l-1;
}
int main()
{
int op;
string w;
while (ifs >> op >> w)
{
if (op == 0)
{
insert(w);
}
else if (op == 1)
{
remove(w);
}
else if (op == 2)
{
ofs << get_number_of_occurences(w) << "\n";
}
else if (op == 3)
{
ofs << get_longest_prefix_length(w) << "\n";
}
}
}