Cod sursa(job #1355653)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 22 februarie 2015 21:54:43
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include<cstdio>
#include<cstring>

using namespace std;

int lg,op;
char s[100],*p;
struct trie
{
    trie *fiu[26];
    int nrfii,nrap;
    trie()
    {
        nrfii=nrap=0;
        for(int i=0;i<=25;i++)
        {
            fiu[i]=NULL;
        }
    }
};

trie *r;

void insert(trie *t,char *s)
{
    if(strlen(s)==0)
    {
        t->nrap++;
        return;
    }
    if(t->fiu[s[0]-'a']==NULL)
    {
        t->fiu[s[0]-'a']=new trie;
        t->nrfii++;
    }
    insert(t->fiu[s[0]-'a'],s+1);
    return;
}

int remove(trie *t,char *s)
{
    if(*s==0)
    {
        t->nrap--;
        if(t->nrap==0&&t->nrfii==0&&t!=r)
        {
            delete t;
            t=0;
            return 1;
        }
        return 0;
    }
    if(remove(t->fiu[*s-'a'],s+1))
    {
        t->nrfii--;
        if(t->nrap==0&&t->nrfii==0&&t!=r)
        {
            delete t;
            t=0;
            return 1;
        }
    }
    return 0;
}

int nrwords(trie *t,char *s)
{
    if(strlen(s)==0)
    {
        return t->nrap;
    }
    if(t->fiu[s[0]-'a']==NULL)
    {
        return 0;
    }
    return nrwords(t->fiu[s[0]-'a'],s+1);
}

int prefix(trie *t,char *s)
{
    if(t->fiu[s[0]-'a']==NULL||!strlen(s))
    {
        return 0;
    }
    return 1+prefix(t->fiu[s[0]-'a'],s+1);
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    r=new trie;
    while(!feof(stdin))
    {
        scanf("%d %s\n",&op,&s);
        p=s;
        if(op==0)
        {
            insert(r,p);
        }
        if(op==1)
        {
             remove(r,p);
        }
        if(op==2)
        {
            printf("%d\n",nrwords(r,p));
        }
         if(op==3)
        {
            printf("%d\n",prefix(r,p));
        }
    }
}