Cod sursa(job #1881170)

Utilizator GinguIonutGinguIonut GinguIonut Data 16 februarie 2017 10:58:29
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#include <string.h>

#define CH *ch-'a'

using namespace std;

char line[33];

struct Trie
{
    int cnt, nrfii;
    Trie *fii[26];

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

Trie *T=new Trie;

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

    if(node->fii[CH]==0)
    {
        node->fii[CH]=new Trie;
        node->nrfii++;
    }

    insertTrie(node->fii[CH], ch+1);
}

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

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

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

int prefixTrie(Trie *node, char *ch, int k)
{
    if(*ch=='\n' || node->fii[CH]==0)
        return k;
    return prefixTrie(node->fii[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': insertTrie(T, line+2); break;
            case '1': eraseTrie(T, line+2); break;
            case '2': printf("%d\n", queryTrie(T, line+2)); break;
            default: printf("%d\n", prefixTrie(T, line+2, 0));
        }
        fgets(line, 32, stdin);
    }
}