Cod sursa(job #902560)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 1 martie 2013 15:02:52
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>

struct nod
{
    int ap,fin;
    nod *next[29];
};

nod *rad;

void add(char s[22],int ind,nod **nd)
{
    if(s[ind]==NULL)return;

    if(!*nd){*nd=new nod;(*nd)->ap=0;(*nd)->fin=0;for(int i=0;i<29;++i)(*nd)->next[i]=NULL;}
    (*nd)->ap++;

    if(s[ind+1]==NULL)
    (*nd)->fin++;
    else add(s,ind+1,&(*nd)->next[s[ind+1]-'a']);
}

void remove(char s[22],int ind,nod **nd)
{
    if(s[ind]==NULL)return;

    (*nd)->ap--;
    if(s[ind+1]==NULL)(*nd)->fin--;
    else remove(s,ind+1,&(*nd)->next[s[ind+1]-'a']);
}

int getAp(char s[22],int ind,nod *nd)
{
    if(s[ind]==NULL)return 0;
    if(!nd)return 0;

    if(s[ind+1]==NULL)return nd->fin;
    else getAp(s,ind+1,nd->next[s[ind+1]-'a']);
}

int getPref(char s[22],int ind,nod *nd,int max)
{
    if(!nd)return max;

    if(nd->ap>0)max++;
    else return max;
    if(s[ind+1]==NULL)return max;
    else getPref(s,ind+1,nd->next[s[ind+1]-'a'],max);
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    rad=new nod;
    for(int i=0;i<29;++i)rad->next[i]=NULL;
    int c;
    char s[22];

    while(!feof(stdin))
    {
        scanf("%d %s\n",&c,&s);
        if(c==0)add(s,0,&rad->next[s[0]-'a']);
        if(c==1)remove(s,0,&rad->next[s[0]-'a']);
        if(c==2)printf("%d\n",getAp(s,0,rad->next[s[0]-'a']));
        if(c==3)printf("%d\n",getPref(s,0,rad->next[s[0]-'a'],0));
        //scanf("%d %s\n",&c,&s);
    }

    return 0;
}