Cod sursa(job #1977135)

Utilizator cristigrigoreGrigore Cristan Andrei cristigrigore Data 5 mai 2017 00:59:53
Problema Trie Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.83 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define id (*s - 'a')
typedef struct nod
{
    int nrf;
    int cuv;
    struct nod *fii[26];
} nod;
void insert(nod* trie, char *s)
{
    if(*s == '\0')
    {
        trie->cuv++;
        return;
    }
    if(!trie->fii[id])
    {
        trie->fii[id] = (nod*) malloc(sizeof(nod));
        memset( trie->fii[id]->fii, 0, sizeof( trie->fii ) );
        trie->fii[id]->cuv = 0;
        trie->fii[id]->nrf = 0;
        trie->nrf++;
    }
    insert(trie->fii[id],s+1);
}
int del(nod* trie, char *s, int k)
{
   if(*s=='\0')
   {
       if(trie->cuv > 1)
       {
           trie->cuv--;
           return 0;
       }
       else
       {
           free(trie);
           return 1;
       }
   }
   if(del(trie->fii[id],s+1,++k))
   {
       trie->nrf--;
       trie->fii[id]=0;
   }
   if(trie->nrf==0 && trie->cuv==0 && k!=0)
   {
     free(trie);
     return 1;
   }

   return 0;
}
int apar(nod* trie, char* s)
{
    if(*s=='\0')
    {
        return trie->cuv;
    }
    return 0 + apar(trie->fii[id],s+1);
}
int pref(nod* trie, char* s)
{
    if(*s == '\0' || !trie->fii[id]) return 0;
    return 1 + pref(trie->fii[id],s+1);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int op,i;
    char s[30];
    nod *trie;

    trie = (nod*) malloc(sizeof(nod));
    memset( trie->fii, 0, sizeof( trie->fii ) );
    trie->cuv = 0;
    trie->nrf = 0;
    while(scanf("%d%s",&op,s)==2)
    {
        switch(op)
        {
            case 0:
                insert(trie,s);
                break;
            case 1:
                i = del(trie,s,0);
                break;
            case 2:
                printf("%d\n",apar(trie,s));
                break;
            case 3:
                printf("%d\n",pref(trie,s));
                break;

        }
    }

    return 0;
}