Cod sursa(job #1786113)

Utilizator GinguIonutGinguIonut GinguIonut Data 22 octombrie 2016 13:55:02
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#include <string.h>

#define CH *ch-'a'

using namespace std;

char line[33];

struct Trie
{
    int cnt;
    int nrfii;
    Trie *fiu[26];

    Trie()
    {
        nrfii=cnt=0;
        memset(fiu, 0, sizeof(fiu));
    }
};

Trie *T=new Trie;

void insert(Trie *node, char *ch)
{
    if(*ch=='\n')
    {
        node->cnt++;
        return;
    }

    if(node->fiu[CH]==0)
    {
        node->fiu[CH]=new Trie;
        node->nrfii++;
    }
    insert(node->fiu[CH], ch+1);
}

bool erase(Trie *node, char *ch)
{
    if(*ch=='\n')
        node->cnt--;
    else
    {
        if(erase(node->fiu[CH], ch+1))
        {
            node->nrfii--;
            node->fiu[CH]=NULL;
        }
    }

    if(node->cnt==0 && node->nrfii==0 && node!=T)
    {
        delete node;
        return 1;
    }
    return 0;
}

int que(Trie *node, char *ch)
{
    if(*ch=='\n')
        return node->cnt;
    if(node->fiu[CH])
        return que(node->fiu[CH], ch+1);
    return 0;
}

int pre(Trie *node, char *ch, int k)
{
    if(*ch=='\n' || node->fiu[CH]==0)
        return k;
    return pre(node->fiu[CH], ch+1, k+1);
}

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

    fgets(line, 32, stdin);

    while(!feof(stdin))
    {
        switch(line[0])
        {
            case '0': insert(T, line+2); break;
            case '1': erase(T, line+2); break;
            case '2': printf("%d\n", que(T, line+2)); break;
            case '3': printf("%d\n", pre(T, line+2, 0)); break;
        }
        fgets(line, 32, stdin);
    }
}