Cod sursa(job #2277606)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 6 noiembrie 2018 16:52:59
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>

struct trie
{
    int number, children;
    trie *next[26];

    trie()
    {
        memset(next, 0, sizeof(next));
        number = children = 0;
    }
} *start;
char str[24];

void trie_insert(trie*, char*);
bool trie_delete(trie*, char*);
int trie_count(trie*, char*);
int trie_prefix(trie*, char*);

trie* trie_create()
{
    trie *result = (trie*)malloc(sizeof(trie));
    result->children = result->number = 0;
    memset(result->next, 0, sizeof(result->next));

    return result;
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);

    start = trie_create();

    while(fgets(str, 24, 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)); break;
            default: return 0;
        }
    }

    return 0;
}

#define CH (*str - 'a')

int trie_prefix(trie *nod, char *str)
{
    int pos = 0;
    while(*str != '\n' && nod->next[CH] != 0)
    {
        nod = nod->next[CH];
        str++;
        pos++;
    }
    return pos;
}

int trie_count(trie *nod, char *str)
{
    while(*str != '\n')
    {
        if(!nod->next[CH])
            return 0;

        nod = nod->next[CH];
        str++;
    }

    return nod->number;
}

bool trie_delete(trie *nod, char *str)
{
    if(*str == '\n')
        nod->number--;
    else if(trie_delete(nod->next[CH], str+1))
    {
        nod->children--;
        nod->next[CH] = 0;
    }

    if(nod->children == 0 && nod->number == 0 && nod != start)
    {
        free(nod);
        return true;
    }

    return false;
}

void trie_insert(trie *nod, char *str)
{
    while(*str != '\n')
    {
        if(!nod->next[CH])
        {
            nod->next[CH] = trie_create();
            nod->children++;
        }

        nod = nod->next[CH];
        str++;
    }

    nod->number++;
}