Cod sursa(job #1023730)

Utilizator thewildnathNathan Wildenberg thewildnath Data 7 noiembrie 2013 17:15:46
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<stdio.h>
#include<string.h>

struct nod
{
    int nrf,nrc;   //nrf-fii, nrc-cuvinte
    nod* v[27];
    nod()
    {
        nrf=nrc=0;
        memset(v,0,sizeof(v));
    }
};


inline int max(int a,int b)
{return a>b?a:b;}


int k,ok;
char sir[22];
nod* rad=new nod();


void insert(nod* x,int poz)           // ADAUGARE
{
    if(poz==k)
    {
        x->nrc+=1;
        return;
    }
    if(!x->v[sir[poz]-'a'])
    {
        x->nrf+=1;
        x->v[sir[poz]-'a']=new nod();
    }

    insert(x->v[sir[poz]-'a'],poz+1);
}


int erase(nod* x,int poz)            // STERGERE
{
    if(poz==k)
    {
        x->nrc--;
    }
    else if( erase(x->v[sir[poz]-'a'],poz+1) )
    {
        x->v[sir[poz]-'a']=0;
        x->nrf-=1;
    }

    if(!x->nrf && !x->nrc && x!=rad)
    {
        delete x;
        return 1;
    }
    return 0;
}


void num_ap(nod* x,int poz)           // NUMAR APARITII
{
    if(poz==k)
    {
        ok=x->nrc;
        return;
    }
    if(!x->v[sir[poz]-'a'])
        return;

    num_ap(x->v[sir[poz]-'a'],poz+1);
}


void prefix_max(nod* x,int poz)       // PREFIX COMUN MAXIM
{
    ok=poz;
    if(poz==k)
        return;

    if(!x->v[sir[poz]-'a'])
        return;

    prefix_max(x->v[sir[poz]-'a'],poz+1);
}


int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int op,i;
    while(scanf("%d %s\n",&op,&sir)!=EOF)
    {
        k=strlen(sir);
        if(op==0)
            insert(rad,0);
        else if(op==1)
            erase(rad,0);
        else if(op==2)
        {
            num_ap(rad,0);
            printf("%d\n",ok);
        }
        else
        {
            prefix_max(rad,0);
            printf("%d\n",ok);
        }
        memset(sir,0,sizeof(sir));
    }



    return 0;
}