Cod sursa(job #1517537)

Utilizator Eduard6421Eduard Gabriel Eduard6421 Data 4 noiembrie 2015 15:49:20
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include<cstdio>
#include<cstring>

#define CH (*s-'a')

using namespace std;


class trie
{

public :
    int cnt,nrfii;
    trie *fiu[26];

    trie()
    {

        cnt=nrfii=0;
        memset(fiu,NULL,sizeof(fiu));
    }


    void ins(char *s)
    {

        if(*s==NULL)
        {
            this->cnt++;
            return;
        }

        else
        {
            if(this->fiu[CH]==NULL)
            {
                this->fiu[CH] = new trie;
                this->nrfii++;
            }


            this->fiu[CH]->ins(s+1);
        }
    }


    bool del (char *s)
    {

        if(*s==NULL)
        {
            this->cnt--;
        }

        else if( this -> fiu[CH]->del(s+1))
        {

            delete this-> fiu[CH];
            this -> fiu[CH]=0;
            this-> nrfii --;
        }

        if(this->cnt ==0 && this->nrfii ==0)
        {
            return 1;
        }

        return 0;
    }


    int que(char *s)
    {
        if(*s == NULL)
            return this->cnt;

        else
        {

            if(this -> fiu[CH])
                return this->fiu[CH]->que(s+1);
            else
                return 0;
        }


    }

    int pre(char *s , int k)
    {
        if(*s == NULL || this->fiu[CH]==0)
            return k;
        return this->fiu[CH]->pre(s+1,k+1);
    }

    void printer()
    {
        int i;
        for(i=0; i<26; ++i)
            if(this->fiu[i])
            {
                printf("%c",i+'a');
                this->fiu[i]->printer();
            }
        printf("\n");

    }




};

trie *root = new trie;


int main()
{
    FILE *fin,*fout;

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


    char s[21];
    int q;

    while(scanf("%d",&q)!=EOF)
    {
        scanf("%s",s);

        switch (q)
        {
        case 0:
            root->ins(s);
            break;
        case 1:
            root->del(s);
            break;
        case 2:
            printf("%d\n",root->que(s)  );
            break;
        case 3:
            printf("%d\n",root->pre(s,0));
            break;

        }
    }
    return 0;

}