Cod sursa(job #2075151)

Utilizator onescu.iancuOnescu Iancu onescu.iancu Data 25 noiembrie 2017 11:33:26
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <cstdio>
#include <cstring>

#define N 22

using namespace std;

struct nod
{
    int val, nrfii;
    nod *fii[26];
    nod();
};

nod *root= new nod();

nod::nod()
{
    for(int i=0; i<27; i++)
        fii[i]=NULL;
    val=nrfii=0;
}

char a[N], leg, k;

void Add(nod *&r, int c)
{
    if(a[c]==0)
    {
        r->val++;
        return;
    }
    if(!(r->fii[a[c]-'a']))
        {
            r->fii[a[c]-'a']= new nod();
            r->nrfii++;
        }
    Add(r->fii[a[c]-'a'], c+1);
}

int Del(nod *&r, int c)
{
    if(a[c] == '\0')
        r->val--;

    else if(Del(r->fii[a[c]-'a'], c+1))
    {
        r->fii[a[c]-'a']=0;
        r->nrfii--;
    }

    if(r->val == 0 && r->nrfii==0 && r!=root)
    {
        delete r;
        return 1;
    }
    return 0;
}

int Count(nod *&r, int c)
{
    if(a[c] == '\0')
        return r->val;
    if(r->fii[a[c]-'a'] == NULL)
        return 0;
    return Count(r->fii[a[c]-'a'], c+1);
}

int Prefix(nod *&r, int c, int depth=0)
{
    if(r->fii[a[c]-'a'] == NULL)
        return depth;
    return Prefix(r->fii[a[c]-'a'], c+1, depth+1);
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    int op;
    while(!feof(stdin))
    {
        scanf("%d %s\n", &op, a);
        leg=strlen(a);
        switch(op)
        {
        case 0:
            Add(root,0);
            break;
        case 1:
            Del(root,0);
            break;
        case 2:
            printf("%d\n", Count(root,0));
            break;
        case 3:
            printf("%d\n", Prefix(root,0));
            break;
        }
    }
    return 0;
}