Cod sursa(job #1366433)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 1 martie 2015 01:32:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>

#define lit *p - 'a'

using namespace std;

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

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

    int t;
    char w[25];

    while(scanf("%d%s",&t,w) == 2)
    {
        if(t == 0)
            T.Insert(w);
        else
            if(t == 1)
                T.Delete(w);
            else
                if(t == 2)
                    printf("%d\n",T.Count(w));
                else
                    printf("%d\n",T.Prefix(w));
    }
    return 0;
}