Cod sursa(job #1147212)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 19 martie 2014 17:41:33
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>

#define lit *cuvant-'a'

using namespace std;

class Trie{
private:
    int nrfii,cuv;
public:
    Trie *fii[26];
    Trie(){
        for(int i = 0; i < 26; ++i)
            fii[i] = NULL;
        nrfii = cuv = 0;
    }
    void Insert(char *cuvant)
    {
        if(!*cuvant){++cuv;return;}
        if(!fii[lit]){fii[lit] = new Trie; ++nrfii;}
        fii[lit]->Insert(cuvant+1);
    }
    void Delete(char *cuvant)
    {
        if(!*cuvant){
            --cuv;
            return;
        }
        fii[lit]->Delete(cuvant+1);
        if(fii[lit]->cuv == 0 && fii[lit]->nrfii == 0)
        {
            nrfii--;
            delete fii[lit];
            fii[lit] = NULL;
        }
    }
    int Count(char *cuvant)
    {
        if(!*cuvant) return cuv;
        if(fii[lit]) return fii[lit]->Count(cuvant+1);
        return 0;
    }
    int Prefix(char *cuvant)
    {
        if(!fii[lit]) return 0;
        if(*cuvant) return 1 + fii[lit]->Prefix(cuvant+1);
        return 0;
    }
}T;

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

    int tip;
    char word[30];

    while(!feof(stdin))
    {
        scanf("%d %s\n",&tip,&word);
        if(tip == 0)T.Insert(word);
        if(tip == 1)T.Delete(word);
        if(tip == 2)printf("%d\n",T.Count(word));
        if(tip == 3)printf("%d\n",T.Prefix(word));
    }

    return 0;
}