Cod sursa(job #2277576)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 6 noiembrie 2018 16:05:08
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>
#include <cstring>
#include <cctype>

#define FILE_IN "trie.in"
#define FILE_OUT "trie.out"

struct trie
{
    int len;
    int drumuri;
    trie *next[32];

    trie()
    {
        memset(next, 0, sizeof(next));
        len = drumuri = 0;
    }
} start;

void modifica(char[], int);
int afis_count(char[]);
int afis_prefix(char[]);

int main()
{
    freopen(FILE_IN, "r", stdin);
    freopen(FILE_OUT, "w", stdout);

    char str[32];

    while(fgets(str, 32, stdin))
    {
        switch(str[0])
        {
            case '0':
            {
                modifica(str+2, +1);
                break;
            }
            case '1':
            {
                modifica(str+2, -1);
                break;
            }
            case '2':
            {
                printf("%i\n", afis_count(str+2));
                break;
            }
            case '3':
            {
                printf("%i\n", afis_prefix(str+2));
                break;
            }
            default: return 0;
        }
    }

    return 0;
}

int afis_prefix(char str[])
{
    int maxim = 0;
    trie *p = &start;
    for(int i = 0; isalpha(str[i]); ++i)
    {
        if(p->drumuri > 0)
            maxim = i;

        if(!p->next[str[i] - 'a'])
            break;

        p = p->next[str[i] - 'a'];
    }

    return maxim;
}

int afis_count(char str[])
{
    trie *p = &start;
    for(int i = 0; isalpha(str[i]); ++i)
    {
        if(!p->next[str[i] - 'a'])
            return 0;

        p = p->next[str[i] - 'a'];
    }

    return p->len;
}

void modifica(char str[], int semn)
{
    trie *p = &start;
    for(int i = 0; isalpha(str[i]); ++i)
    {
        if(!p->next[str[i] - 'a'])
            p->next[str[i] - 'a'] = new trie;

        p = p->next[str[i] - 'a'];
        p->drumuri += semn;
    }

    p->len += semn;
}