Cod sursa(job #603548)

Utilizator vlad2901Vlad Berindei vlad2901 Data 17 iulie 2011 11:56:50
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <stdio.h>

struct trie
{
    int fii, cuvinte;
    trie *fiu[26];

    trie()
    {
        int i;

        fii = 0;
        cuvinte = 0;
        for(i = 0; i<26; ++i)
        {
            fiu[i] = NULL;
        }
    }
} *rad = new trie;

void adauga(trie *nod, char *s)
{
    trie *nou;

    if(s[0] == '\n')
    {
        nod->cuvinte++;
        return;
    }

    if(nod->fiu[s[0] - 'a'] == NULL)
    {
        nou = new trie();
        nod->fiu[s[0] - 'a'] = nou;
        nod->fii++;
    }

    adauga(nod->fiu[s[0] - 'a'], s+1);
}

int sterge(trie *nod, char *s)
{
   if(s[0] == '\n')
   {
       nod->cuvinte--;
   }
   else
   {
        if(nod->fiu[s[0] - 'a'] && sterge(nod->fiu[s[0] - 'a'], s+1))
       {
            nod->fiu[s[0] - 'a'] = NULL;
            nod->fii--;
       }

   }

   if(nod->fii == 0 && nod->cuvinte == 0 && nod != rad)
       {
            delete nod;
            return 1;
       }
       return 0;
}

int aparitii(trie *nod, char *s)
{
    if(s[0] == '\n')
    {
        return nod->cuvinte;
    }
    if(nod->fiu[s[0] - 'a'])
    {
        return aparitii(nod->fiu[s[0] - 'a'], s+1);
    }
    return 0;
}

int prefix(trie *nod, char *s, int k)
{
    if(s[0] == '\n' || nod->fiu[s[0] - 'a'] == NULL)
    {
        return k;
    }

    return prefix(nod->fiu[s[0] - 'a'], s+1, k+1);

}


int main()
{
    char linie[32];

    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);


    do
    {
        fgets(linie, 32, stdin);

        switch(linie[0])
        {
            case '0': adauga(rad, linie+2); break;
            case '1': sterge(rad, linie+2); break;
            case '2': printf("%d\n", aparitii(rad, linie+2)); break;
            case '3': printf("%d\n", prefix(rad, linie+2, 0)); break;
        }
    }
    while(!feof(stdin));

    return 0;
}