Cod sursa(job #1023688)

Utilizator thewildnathNathan Wildenberg thewildnath Data 7 noiembrie 2013 16:23:18
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<stdio.h>
#include<string.h>

struct nod
{
    int nrf;
    nod* v[27];
    nod()
    {
        nrf=0;
        memset(v,0,sizeof(v));
    }
};

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

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

inline bool comun(nod* x)
{
    for(int i=0;i<26;++i)
        if(x->v[i])
            return 1;
    return 0;
}

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

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

void erase(nod* x,int poz)            // STERGERE
{
    if(poz==k)
    {
        x->nrf-=1;
        return;
    }
    if(!x->v[sir[poz]])
        return;

    erase(x->v[sir[poz]],poz+1);
}

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

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

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

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

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

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int op,i;
    while(scanf("%d %s\n",&op,&aux)!=EOF)
    {
        k=strlen(aux);
        for(i=0;i<k;++i)
            sir[i]=aux[i]-'a';
        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(aux,0,sizeof(aux));
    }



    return 0;
}