Cod sursa(job #1146164)

Utilizator cristitamasTamas Cristian cristitamas Data 18 martie 2014 19:25:50
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#define Drum *Lit-'a'
using namespace std;

char C[50];
int Op;

class trie
{
    public:
        int Nc, Nf;
        trie *F[30];
    trie()
    {
        Nc=Nf=0;
        memset(F,0,sizeof(F));
    }
    void Inserare(char *Lit)
    {
        if(*Lit)
        {
            if(!F[Drum])
            {
                Nf++;
                F[Drum]=new trie;
            }
            F[Drum]->Inserare(Lit+1);
        }
        else
            Nc++;
    }
    int Stergere(char *Lit)
    {
        if(!*Lit)
            Nc--;
        else
            if(F[Drum]->Stergere(Lit+1))
            {
                delete F[Drum];
                F[Drum]=0;
                --Nf;
            }
        if(Nc || Nf)
                return 0;
        return 1;
    }
    int Aparitii(char *Lit)
    {
        if(!*Lit)
            return Nc;
        else
        {
            if(F[Drum])
                return F[Drum]->Aparitii(Lit+1);
            else
                return 0;
        }
    }
    int Lungime_Prefix(char *Lit, int Size)
    {
        if(!*Lit)
            return Size;
        if(F[Drum])
            return F[Drum]->Lungime_Prefix(Lit+1,Size+1);
        return Size;
    }

}Rad;



int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while(!feof(stdin))
    {
        scanf("%d %s\n",&Op,C);
        switch(Op)
        {
            case 0:
                Rad.Inserare(C);
                break;
            case 1:
                Rad.Stergere(C);
                break;
            case 2:
                printf("%d\n",Rad.Aparitii(C));
                break;
            case 3:
                printf("%d\n",Rad.Lungime_Prefix(C,0));
                break;
        }
    }
    return 0;
}