Cod sursa(job #1197017)

Utilizator alecsandrualex cuturela alecsandru Data 10 iunie 2014 12:18:37
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.66 kb
#include<cstdio>
using namespace std;
class TRIE
{
public:
    class NOD
    {
    public:
        int cuv,nfi;
        NOD *fii[26];

        NOD()
        {
            int i;
            this->cuv=0;
            this->nfi=0;
            for(i=0;i<26;i++)
            {
                this->fii[i]=NULL;
            }
        }

        void add(char *s)
        {
            if(s[0]==0)
            {
                this->cuv++;
            }
            else
            {
                if(this->fii[s[0]-'a']==NULL)
                {
                    this->fii[s[0]-'a']=new NOD();
                    this->nfi++;
                }
                this->fii[s[0]-'a']->add(s+1);
            }
        }

        int fin(char *s)
        {
            if(s[0]==0)
                return this->cuv;
            else
            {
                if(this->fii[s[0]-'a']==NULL)
                    return 0;
                return this->fii[s[0]-'a']->fin(s+1);
            }
        }

        int pref(char *s)
        {
            if(s[0]==0)
                return 0;
            else
            {
                if(this->fii[s[0]-'a']==NULL)
                    return 0;
                return this->fii[s[0]-'a']->pref(s+1)+1;
            }
        }

        void del(char *s)
        {
            if(s[0]==0)
            {
                this->cuv--;
            }
            else
            {
                this->fii[s[0]-'a']->del(s+1);
                if(this->fii[s[0]-'a']->cuv==0&&this->fii[s[0]-'a']->nfi==0)
                {
                    delete this->fii[s[0]-'a'];
                    this->nfi--;
                    this->fii[s[0]-'a']=NULL;
                }
            }
        }
    };

    NOD *rad;

    TRIE()
    {
        this->rad=new NOD();
    }

    void add(char *s)
    {
        rad->add(s);
    }
    void del(char *s)
    {
        rad->del(s);
    }
    int  fin(char *s)
    {
        return rad->fin(s);
    }
    int pref(char *s)
    {
        return rad->pref(s);
    }
};
TRIE t;
int main()
{
    char sir[21];
    int op;
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while(scanf("%d ",&op)==1)
    {
        scanf("%s",&sir);
        //printf("%d %s\n", op, sir);
        switch(op)
        {
            case 0:t.add(sir);
                    break;
            case 1:t.del(sir);
                    break;
            case 2:printf("%d\n",t.fin(sir));
                    break;
            case 3:printf("%d\n",t.pref(sir));
                    break;
        }
    }
    return 0;
}