Cod sursa(job #1519805)

Utilizator ipus1Stefan Enescu ipus1 Data 7 noiembrie 2015 21:10:57
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<cstdio>
char s[21];
struct trie
    {int cnt,nrfii;
    trie *fii[26];
    trie()
        {cnt=nrfii=0;
        for(int i=0;i<26;i++)
            fii[0]=NULL;
        }
    };
trie *T;
void insert(trie *nod,char *s)
    {if(*s==NULL)
        {nod->cnt++;
        return;
        }
    if(nod->fii[*s-'a']==NULL)
        {nod->fii[*s-'a']=new trie;
        nod->nrfii++;
        }
    insert(nod->fii[*s-'a'],s+1);
    }
bool remove(trie *nod,char *s)
    {if(*s==NULL)
        nod->cnt--;
    else
        if(nod->fii[*s-'a']!=NULL&&remove(nod->fii[*s-'a'],s+1)==1)
            {nod->nrfii--;
            nod->fii[*s-'a']=NULL;
            }
    if(nod!=T&&nod->nrfii==0&&nod->cnt==0)
        {delete nod;
        return 1;
        }
    return 0;
    }
int count(trie *nod,char *s)
    {if(*s==NULL)
        {return nod->cnt;
        }
    if(nod->fii[*s-'a']==NULL)
        return 0;
    return count(nod->fii[*s-'a'],s+1);
    }
int prefix(trie *nod,char *s)
    {if(*s==NULL)
        return 0;
    if(nod->fii[*s-'a']==NULL)
        return 0;
    return 1+prefix(nod->fii[*s-'a'],s+1);
    }
int main ()
{freopen ("trie.in","r",stdin);
freopen ("trie.out","w",stdout);
int x,y;
scanf("%d",&x);
T=new trie;
while(scanf("%s",&s)!=EOF)
    {if(x==0)
        insert(T,s);
    else
        if(x==1)
            remove(T,s);
        else
            if(x==2)
                {y=count(T,s);
                printf("%d\n",y);
                }
            else
                {y=prefix(T,s);
                printf("%d\n",y);
                }
    scanf("%d",&x);
    }
return 0;
}