Cod sursa(job #1219451)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 14 august 2014 11:05:46
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <cstring>
#define lit *p - 'a'

using namespace std;

class Trie{
public:
    int cuv,nrf;
    Trie *fii[26];
    Trie(){
        memset(fii,0,sizeof(fii));
        nrf = cuv = 0;
    }
    void Insert(char *p)
    {
        if(!*p){
            ++cuv;
            return;
        }
        if(!fii[lit]){
            fii[lit] = new Trie;
            ++nrf;
        }
        fii[lit]->Insert(p+1);
    }
    void Delete(char *p){
        if(!*p){
            --cuv;
            return;
        }
        fii[lit]->Delete(p+1);
        if(fii[lit]->nrf == 0 && fii[lit]->cuv == 0)
        {
            delete fii[lit];
            fii[lit] = 0;
            --nrf;
        }
    }
    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);
    }
}T;


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

    int op;
    char c[30];
    while(scanf("%d",&op) != -1){
        scanf("%s",c);
        if(op == 0)
            T.Insert(c);
        else
            if(op == 1)
                T.Delete(c);
            else
                if(op == 2)
                    printf("%d\n",T.Count(c));
                else
                    printf("%d\n",T.Prefix(c));
    }

    return 0;
}