Pagini recente » Cod sursa (job #1163398) | Cod sursa (job #1111853) | Cod sursa (job #897300) | Cod sursa (job #409822) | Cod sursa (job #757705)
Cod sursa(job #757705)
//Include
#include <fstream>
#include <cstring>
using namespace std;
//Definitii
#define letter (*word - 'a')
//Constante
const int MAX_SIZE = 22;
const int LETTERS = 26;
//Structuri
struct trie
{
int words;
int sons;
trie *son[LETTERS];
trie()
{
words = sons = 0;
memset(son, 0, sizeof(son));
}
};
//Functii
void insert(trie *node, char *word);
bool erase(trie *node, char *word);
int query(trie *node, char *word);
int prefix(trie *node, char *word, int length);
//Variabile
ifstream in("trie.in");
ofstream out("trie.out");
int type;
char currentWord[MAX_SIZE];
trie *root = new trie;
//Main
int main()
{
while(in >> type >> currentWord)
{
switch(type)
{
case 0: { insert(root, currentWord); break; }
case 1: { erase(root, currentWord); break; }
case 2: { out << query(root, currentWord) << '\n'; break; }
case 3: { out << prefix(root, currentWord, 0) << '\n'; break; }
}
}
in.close();
out.close();
return 0;
}
void insert(trie *node, char *word)
{
if(!*word)
{
++node->words;
return ;
}
if(!node->son[letter])
{
++node->sons;
node->son[letter] = new trie;
}
insert(node->son[letter], word+1);
}
bool erase(trie *node, char *word)
{
if(!*word)
--node->words;
else if(erase(node->son[letter], word+1))
{
node->son[letter] = false;
--node->sons;
}
if(node->sons || node == root || node->words)
return false;
delete node;
return true;
}
int query(trie *node, char *word)
{
if(!*word)
return node->words;
if(node->son[letter])
return query(node->son[letter], word+1);
return 0;
}
int prefix(trie *node, char *word, int length)
{
if(!*word || !node->son[letter])
return length;
return prefix(node->son[letter], word+1, length+1);
}