Cod sursa(job #1189045)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 21 mai 2014 10:04:52
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<stdio.h>
#include<string.h>
#define Nmax 30
#define Lmax 26

class Trie;

int op;
char s[Nmax];
Trie *T;

class Trie
{
    public:
        Trie()
        {
            nrfii=0;
            aparitii=0;
            for (int i=0;i<Lmax;i++)
                fii[i]=NULL;
        }
        ~Trie()
        {
        }
        void insert(char *s)
        {
            if (this->fii[*s-'a']==NULL && strlen(s))
            {
                this->nrfii++;
                this->fii[*s-'a']=new Trie();
            }

            if (strlen(s)) this->fii[*s-'a']->insert(s+1);
                else this->aparitii++;
        }
        void remove(char *s)
        {
            if (strlen(s))
            {
                this->fii[*s-'a']->remove(s+1);
                if (this->fii[*s-'a']->aparitii==0 && this->fii[*s-'a']->nrfii==0 && this!=T)
                {
                    this->fii[*s-'a']=NULL;
                    this->nrfii--;
                }
            }
            else this->aparitii--;
        }
        int nrap(char *s)
        {
            if (this==NULL) return 0;
            if (!strlen(s)) return this->aparitii;
            return this->fii[*s-'a']->nrap(s+1);
        }
        int prefix(char *s,int k)
        {
            if (this->fii[*s-'a']==NULL || !strlen(s)) return k;
                else return this->fii[*s-'a']->prefix(s+1,k+1);
        }

    private:
        int nrfii,aparitii;
        Trie *fii[Lmax];
};

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

    T=new Trie();
    while (1)
    {
        if (feof(stdin)) return 0;
        scanf("%d %s\n",&op,s);
        if (op==0) T->insert(s);
            else if (op==1) T->remove(s);
                else if (op==2) printf("%d\n",T->nrap(s));
                    else printf("%d\n",T->prefix(s,0));
    }
}