Cod sursa(job #1165101)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 2 aprilie 2014 14:23:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>

using namespace std;

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

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int op;
    char cuv[25];
    while(scanf("%d",&op)==1 && scanf("%s",cuv) == 1)
    {
        if(op == 0)T.Insert(cuv);
        if(op == 1)T.Delete(cuv);
        if(op == 2)printf("%d\n",T.Count(cuv));
        if(op == 3)printf("%d\n",T.Prefix(cuv));
    }

    return 0;
}