Cod sursa(job #1146041)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 18 martie 2014 17:37:37
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <cstring>

#define litera *cuvant-'a'

using namespace std;
class Trie{
private:
    int cuv,nrfii;
public:
    Trie *fii[26];
    Trie()
    {
        cuv = nrfii = 0;
        memset(fii,0,sizeof(fii));
    }
    inline void Insert(char *cuvant){
        if(!*cuvant)
        {
            ++cuv;
            return;
        }
        if(!fii[litera])
        {
            ++nrfii;
            fii[litera] = new Trie;
            fii[litera]->Insert(cuvant+1);
        }
        else fii[litera]->Insert(cuvant+1);
    }
    inline bool Delete(char *cuvant)
    {
        if(!*cuvant) --cuv;
        else if(*cuvant)
        {
            if(fii[litera]->Delete(cuvant+1))
            {
                delete fii[litera];
                fii[litera] = 0;
                --nrfii;
            }
        }
        if(nrfii || cuv) return false;
        else return true;
    }
    inline int nrap(char *cuvant)
    {
        if(*cuvant)
            if(fii[litera])
                return fii[litera]->nrap(cuvant+1);
            else return 0;
        return cuv;
    }
    inline int prefix(char *cuvant)
    {
        if(fii[litera])
            return 1 + fii[litera]->prefix(cuvant+1);
        return 0;
    }
}T;

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

    int tip;
    char cuv[22];
    while(scanf("%d",&tip)!= -1 && scanf("%s",cuv)!= -1)
    {
        if(tip == 0) {T.Insert(cuv);continue;}
        if(tip == 1) {T.Delete(cuv);continue;}
        if(tip == 2) {printf("%d\n",T.nrap(cuv));continue;}
        if(tip == 3) {printf("%d\n",T.prefix(cuv));continue;}
    }
    return 0;
}