Cod sursa(job #1354127)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 21 februarie 2015 17:38:52
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct Trie
{
    Trie *fii[31];
    int ap;
    int nr_fii;
    Trie ()
    {
        nr_fii=0;
        ap=0;
        for (int i=0; i<26; i++) fii[i]=NULL;
    }
};
Trie *t=new Trie;
int i,op,baa,Max;
char s[30];

inline void upd(Trie *t,char *s)
{
    if(strlen(s)==0)
    {
        t->ap+=baa;
        return;
    }

    if(t->fii[s[0]-'a']==NULL)
    {
        t->nr_fii++;
        t->fii[s[0]-'a']=new Trie;
    }

    upd(t->fii[s[0]-'a'], s+1);

    if(baa==-1)
    {
        if (t->fii[s[0]-'a']->ap==0 && t->fii[s[0]-'a']->nr_fii==0)
        {
            t->fii[s[0]-'a']=NULL;
            t->nr_fii--;
        }
    }
}

inline void apar(Trie *t,char *s)
{
    if(strlen(s)==0)
    {
        printf("%d\n",t->ap);
        return;
    }

    if(t->fii[s[0]-'a']==NULL)
    {
        printf("0\n");
        return;
    }

    apar(t->fii[s[0]-'a'], s+1);

}

inline int prefix(Trie *t,char *s,int nr)
{
    if(strlen(s)==0) return nr;
    if(t->fii[s[0]-'a']==NULL)  return nr;

    return prefix(t->fii[s[0]-'a'], s+1,nr+1);
}

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

    scanf("%d ",&op);
    memset(s,'\0',sizeof(s));
    gets(s);

    while(!feof(stdin))
    {

        if(op==0)
        {
            baa=1;
            upd(t,s);
        }
        else if(op==1)
        {
            baa=-1;
            upd(t,s);
        }
        else if(op==2) apar(t,s);
        else
           printf("%d\n",prefix(t,s,0));

        memset(s,'\0',sizeof(s));
        scanf("%d ",&op);
        gets(s);
    }

    return 0;
}