Cod sursa(job #677343)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 10 februarie 2012 00:44:56
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>
#include <cstring>

#define LT (*s - 'a')

using namespace std;

struct Trie
{
    int cnt, nrFii;
    Trie* fiu[26];

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

Trie *trie = new Trie;

void insert(Trie * nod, char* s)
{
    if(*s == '\n')
    {
        nod->cnt++;
        return;
    }
    if(!nod->fiu[ LT ])
    {
        nod->nrFii++;
        nod->fiu[ LT ] = new Trie;
    }
    insert(nod->fiu[ LT ], s + 1);
}

int del(Trie * nod, char* s)
{
    if(*s == '\n')
    {
        nod->cnt--;
    }
    else if(del(nod->fiu[ LT ], s + 1))
    {
        nod->fiu[ LT ] = 0;
        nod->nrFii--;
    }
    if(!nod->cnt  && !nod->nrFii)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int detAp(Trie * nod, char *s)
{
    if(*s == '\n')
        return nod->cnt;
    if(nod -> fiu[ LT ])
        return detAp(nod->fiu[ LT ], s + 1);
    return 0;
}

int prefix(Trie * nod, char * s, int k)
{
    if(*s == '\n' || !nod->fiu[ LT ])
    {
        return k;
    }
    return prefix(nod->fiu[ LT ], s + 1, k + 1);
}

int main()
{
    char str[32];
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    fgets(str, 32, stdin);
    while(!feof(stdin))
    {
        switch(str[0])
        {
            case '0': insert(trie, str + 2); break;
            case '1': del(trie, str + 2); break;
            case '2': printf("%d\n",detAp(trie, str + 2)); break;
            case '3': printf("%d\n",prefix(trie, str + 2, 0)); break;
        }
        fgets(str, 32, stdin);
    }
    return 0;
}