Cod sursa(job #2277596)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 6 noiembrie 2018 16:40:53
Problema Trie Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#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);
}