Cod sursa(job #2369468)

Utilizator YouDontNeedMyNameJurcut Paul YouDontNeedMyName Data 5 martie 2019 23:42:57
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>

#include <cstring>



#define CH (*s - 'a')

using namespace std;

char line[32];

struct trie{

    int cnt,nrfii;

    trie *fiu[26];

    trie(){

        cnt=nrfii=0;

        memset(fiu,0,sizeof(fiu));

    }

};

trie *t=new trie;

void ins(trie *nod, char *s)

{

    if(*s=='\n')

    {

        nod->cnt++;

        return;

    }

    if(nod->fiu[CH]==0)

    {

        nod->fiu[CH]=new trie;

        nod->nrfii++;

    }

    ins(nod->fiu[CH],s+1);

}

int del(trie* nod, char *s)

{

    if(*s=='\n')

    {

        nod->cnt--;

    }

    else if(del(nod->fiu[CH],s+1))

    {

        nod->nrfii--;

        nod->fiu[CH]=0;

    }

    if(nod->cnt==0 && nod->nrfii==0 && nod!=t)

    {

        delete nod;

        return 1;

    }

    return 0;

}

int que(trie *nod, char *s)

{

    if(*s=='\n')

    {

        return nod->cnt;

    }

    if(nod->fiu[CH])

    {

        return que(nod->fiu[CH],s+1);

    }

    return 0;

}

int pre(trie *nod, char *s, int k)

{

    if(*s=='\n' || nod->fiu[CH]==0)

        return k;

    return pre(nod->fiu[CH],s+1,k+1);

}

int main()

{

    freopen("trie.in","r",stdin);

    freopen("trie.out","w",stdout);



    fgets(line,32,stdin);



    while(!feof(stdin))

    {

        switch(line[0])

        {

            case '0': ins(t,line+2); break;

            case '1': del(t,line+2); break;

            case '2': printf("%d\n",que(t,line+2)); break;

            case '3': printf("%d\n",pre(t,line+2,0)); break;

        }

        fgets(line,32,stdin);

    }

    return 0;

}