Cod sursa(job #775799)

Utilizator andrei.tafaDincu Andrei - Marius andrei.tafa Data 8 august 2012 23:09:13
Problema Trie Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.32 kb
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct celula {
                int valoare;
                struct celula **adr;
                } TCelula,*ACelula;
ACelula AlocCelula()
{
    ACelula x = (ACelula)calloc(1,sizeof(TCelula));
    if (!x) return NULL;
    x->adr = (ACelula *)calloc(27,sizeof(ACelula));
    if (!x->adr) return NULL;
    return x;
}
ACelula Initializare()
{
    ACelula x = AlocCelula();
    if (!x) return NULL;
    return x;
}
void Adauga(ACelula a,char sir[])
{
    int i;
    ACelula aux = a;
    for (i=0;i<strlen(sir);i++)
            if (aux->adr[sir[i]-'a'] == NULL) {aux->adr[sir[i]-'a'] = AlocCelula();aux = aux->adr[sir[i]-'a'];aux->valoare = 1;}
            else {aux = aux->adr[sir[i]-'a'];aux->valoare++;}

}
int NrAparitii(ACelula a,char sir[])
{
    int i;
    ACelula aux = a;
    for (i=0;i<strlen(sir);i++)
        if (aux->adr[sir[i]-'a']==NULL) return 0;
        else aux = aux->adr[sir[i]-'a'];
    int nr=0;
    for (i=0;i<27;i++)
        if (aux->adr[i]) nr += aux->adr[i]->valoare;
    if (aux->valoare==nr) return 0;
    else return  aux->valoare - nr;
}
void Sterge(ACelula ag,char sir[])
{
    int i;
    ACelula a = ag;
    i = NrAparitii(ag,sir);
    if (i==0) return;
    for (i=0;i<strlen(sir);i++)
    {
        if (a->adr[sir[i]-'a']->valoare==1) {a->valoare--;a->adr[sir[i]-'a']=NULL;return;}
        else {a->valoare--;a = a->adr[sir[i]-'a'];}
    }
    if (a) a->valoare--;
}
int LungimePrefix(ACelula a,char sir[])
{
    int i=0,lung=0;
    ACelula aux = a;
    for (i=0;i<strlen(sir);i++)
        if (aux->adr[sir[i]-'a']!=NULL) {lung++;aux = aux->adr[sir[i]-'a'];}
        else return lung;
    return lung;
}
void Rezolva(ACelula a)
{
    int x;
    char sir[21];
    while (scanf("%i %s",&x,sir)==2)
                                  switch(x) {
                                            case 0: Adauga(a,sir);break;
                                            case 1: Sterge(a,sir);break;
                                            case 2: printf("%i\n",NrAparitii(a,sir));break;
                                            case 3: printf("%i\n",LungimePrefix(a,sir));break;
                                            }


}
int main()
{
    ACelula a = Initializare();
    freopen("trie.in","rt",stdin);
    freopen("trie.out","wt",stdout);
    Rezolva(a);
    return 0;

}