Pagini recente » Cod sursa (job #649756) | Cod sursa (job #1506206) | Cod sursa (job #445132) | Cod sursa (job #1442515) | Cod sursa (job #1813362)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
#define cout g
struct node
{
int value = 0;
int nr_fii = 0;
node *next[26] = {}; /// 26 characters in our alphabet
};
node *root = new node;
void addTrie(node *nd, char *w)
{
if (*w == '\0') {
nd->value++;
return;
}
int nxt = *w - 'a';
if (nd->next[nxt] == 0)
{
nd->nr_fii++;
nd->next[nxt] = new node;
}
node* current = nd->next[nxt];
addTrie(current, w+1);
}
bool removeTrie(node *nd, char *w)
{
if (*w == '\0') {
nd->value--;
if (nd->value == 0 && nd->nr_fii == 0)
{
delete nd;
return true;
}
return false;
}
int nxt = *w - 'a';
node *current = nd->next[nxt];
if (removeTrie(current, w+1))
{
nd->next[nxt] = 0;
nd->nr_fii--;
if (nd->nr_fii == 0 && nd->value == 0) {
delete nd;
return true;
}
return false;
}
return false;
}
int getTrie(node *nd, char *w)
{
if (*w == '\0') {
return nd->value;
}
int nxt = *w - 'a';
if (nd->next[nxt] == 0)
{
return 0;
}
node *current = nd->next[nxt];
getTrie(current, w+1);
}
int queryTrie(node *nd, char *w, int k = 0)
{
if (*w == '\0')
{
return k;
}
int nxt = *w - 'a';
if (nd->next[nxt] == 0)
{
return k;
}
node *current = nd->next[nxt];
return queryTrie(current, w+1, k+1);
}
int main()
{
int op;
char word[32];
f >> op;
do
{
f >> word;
if (op == 0)
{
addTrie(root, word);
}
else if (op == 1)
{
removeTrie(root, word);
}
else if (op == 2)
{
cout << getTrie(root, word) << '\n';
}
else if (op == 3)
{
cout << queryTrie(root, word) << '\n';
}
}
while(f >> op);
return 0;
}