Cod sursa(job #788244)

Utilizator visanrVisan Radu visanr Data 14 septembrie 2012 13:23:26
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;


#define ch (*s - 'a')


struct Trie
{
       int cuv, nrfii;
       Trie *fiu[31];
       Trie()
       {
           cuv = nrfii = 0;
           memset(fiu, 0, sizeof(fiu));
       }
};
Trie *T = new Trie;


void Insert(Trie *nod, char *s)
{
     if(*s == '\n')
     {
           nod -> cuv ++;
           return ;
     }
     if(nod -> fiu[ch] == 0)
     {
            nod -> fiu[ch] = new Trie;
            nod -> nrfii ++;
     }
     Insert(nod -> fiu[ch], s + 1);
}

int Delete(Trie *nod, char *s)
{
    if(*s == '\n')
    {
          nod -> cuv --;
    }else
    {
         if(Delete(nod -> fiu[ch], s + 1))
         {
                       nod -> fiu[ch] = 0;
                       nod -> nrfii --;
         }
    }
    if(nod -> cuv == 0 && nod -> nrfii == 0 && nod != T)
    {
           delete nod;
           return 1;
    }
    return 0;
}

int Count(Trie *nod, char *s)
{
    if(*s == '\n') return nod -> cuv;
    if(nod -> fiu[ch]) return Count(nod -> fiu[ch], s + 1);
    return 0;
}

int Prefix(Trie *nod, char *s, int k)
{
      if(*s == '\n' || nod -> fiu[ch] == 0) return k;
      return Prefix(nod -> fiu[ch], s + 1, k + 1);
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    char s[31];
    fgets(s, 31, stdin);
    while(!feof(stdin))
    {
                       if(s[0] == '0') Insert(T, s + 2);
                       if(s[0] == '1') Delete(T, s + 2);
                       if(s[0] == '2') printf("%i\n", Count(T, s + 2));
                       if(s[0] == '3') printf("%i\n", Prefix(T, s + 2, 0));
                       fgets(s, 31, stdin);
    }
    return 0;
}