Pagini recente » Cod sursa (job #518955) | Cod sursa (job #2373619) | Cod sursa (job #1385062) | Cod sursa (job #119722) | Cod sursa (job #1106110)
#include<stdio.h>
#include<string.h>
using namespace std;
FILE *in,*out;
//definitii
#define letter (*word-'a')
//constante
const int letterMax=21;
const int letters=26;
//structuri
struct trie_t
{
int words;
int sons;
trie_t *son[letters];
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 lenght=0);
//variabile
int type;
char curentWord[letterMax];
trie_t *root= new trie_t;
int main(void)
{
in=fopen("trie.in","rt");
out=fopen("trie.out","wt");
for(;;)
{
fscanf(in, "%d%s", &type, curentWord);
if(feof(in))
break;
if(type)
{
if(type==1)
erase(root,curentWord);
else if(type==2)
fprintf(out,"%d\n", query(root,curentWord));
else if(type==3)
fprintf(out,"%d\n", prefix(root,curentWord));
}
else
{
insert(root,curentWord);
}
}
}
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 lenght)
{
if(!*word || !node->son[letter])
return lenght;
return prefix(node->son[letter], word+1, lenght+1);
}