Pagini recente » Cod sursa (job #2510526) | Cod sursa (job #2126028) | Cod sursa (job #217264) | Cod sursa (job #2943601) | Cod sursa (job #2277596)
#include <cstdio>
#include <cstring>
#define FILE_IN "trie.in"
#define FILE_OUT "trie.out"
struct trie
{
int number, children;
trie *next[26];
trie()
{
memset(next, 0, sizeof(next));
number = children = 0;
}
} *start;
void trie_insert(trie*, char*);
bool trie_delete(trie*, char*);
int trie_count(trie*, char*);
char trie_prefix(trie*, char*, char);
int main()
{
freopen(FILE_IN, "r", stdin);
freopen(FILE_OUT, "w", stdout);
start = new trie;
char str[22];
while(fgets(str, 22, stdin))
{
switch(str[0])
{
case '0': trie_insert(start, str+2); break;
case '1': trie_delete(start, str+2); break;
case '2': printf("%i\n", trie_count(start, str+2)); break;
case '3': printf("%i\n", trie_prefix(start, str+2, 0)); break;
default: return 0;
}
}
return 0;
}
#define GRND (*str - 'a')
char trie_prefix(trie *nod, char *str, char pos)
{
if(*str == '\n' || !nod->next[GRND])
return pos;
return trie_prefix(nod->next[GRND], str+1, pos+1);
}
int trie_count(trie *nod, char *str)
{
if(*str == '\n')
return nod->number;
if(nod->next[GRND])
return trie_count(nod->next[GRND], str+1);
return 0;
}
bool trie_delete(trie *nod, char *str)
{
if(*str == '\n')
nod->number--;
else if(trie_delete(nod->next[GRND], str+1))
{
nod->children--;
nod->next[GRND] = 0;
}
if(nod->children == 0 && nod->number == 0 && nod != start)
{
delete nod;
return true;
}
return false;
}
void trie_insert(trie *nod, char *str)
{
if(*str == '\n')
{
nod->number++;
return;
}
if(!nod->next[GRND])
{
nod->next[GRND] = new trie;
nod->children++;
}
trie_insert(nod->next[GRND], str+1);
}