Pagini recente » Cod sursa (job #369506) | Cod sursa (job #3258067) | Cod sursa (job #2142547) | Cod sursa (job #2724457) | Cod sursa (job #1088320)
//Include
#include <stdio.h>
#include <string.h>
using namespace std;
FILE *in, *out;
//Definitii
#define letter *word - 'a'
//Constante
const int word_size = 21;
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
int type;
char currentWord[word_size];
trie *root = new trie;
//Main
int main()
{
in = fopen("trie.in", "rt");
out = fopen("trie.out", "wt");
while(1)
{
fscanf(in,"%d%s", &type, currentWord);
if(feof(in))
break;
switch(type)
{
case 0: {insert(root, currentWord); break; }
case 1: {erase(root, currentWord); break; }
case 2: {fprintf(out, "%d\n", query(root, currentWord)); break; }
case 3: {fprintf(out, "%d\n", prefix(root, currentWord, 0)); break; }
}
}
fclose(in);
fclose(out);
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] = '\0';
--node->sons;
}
if(node == root || node->words || node->sons)
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);
}