Pagini recente » simulareoji | Cod sursa (job #251510) | Cod sursa (job #215195) | Cod sursa (job #597826) | Cod sursa (job #1088322)
// Include
#include <fstream>
#include <cstring>
using namespace std;
// Definitii
#define letter (*word - 'a')
// Constante
const int sz = 21;
const int letters_sz = 26;
// Structuri
struct trie_t
{
int words;
int sons;
trie_t *son[letters_sz];
trie_t()
{
words = sons = 0;
memset(son, '\0', sizeof(son));
}
};
// Functii
void insert(trie_t *node, char *word);
bool erase(trie_t *node, char *word);
int query(trie_t *node, char *word);
int prefix(trie_t *node, char *word, int length=0);
// Variabile
ifstream in("trie.in");
ofstream out("trie.out");
int type;
char currentWord[letters_sz];
trie_t *root = new trie_t;
// 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) << '\n'; break; }
}
}
in.close();
out.close();
return 0;
}
void insert(trie_t *node, char *word)
{
if(!*word)
{
++node->words;
return;
}
if(!node->son[letter])
{
++node->sons;
node->son[letter] = new trie_t;
}
insert(node->son[letter], word+1);
}
bool erase(trie_t *node, char *word)
{
if(!*word)
--node->words;
else if(erase(node->son[letter], word+1))
{
node->son[letter] = '\0';
--node->sons;
}
if(node == root || node->words || node->sons)
return false;
delete node;
return true;
}
int query(trie_t *node, char *word)
{
if(!*word)
return node->words;
if(node->son[letter])
return query(node->son[letter], word+1);
return 0;
}
int prefix(trie_t *node, char *word, int length)
{
if(!*word || !node->son[letter])
return length;
return prefix(node->son[letter], word+1, length+1);
}