Cod sursa(job #236242)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 26 decembrie 2008 23:37:20
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<cstdio>
#include<cstring>
using namespace std;
struct NodT {
    int n;
    int nrf;
    NodT *E[28];

      NodT ()
      {
        n = nrf = 0;
        memset( E, 0, sizeof( E ) );
      }
};
NodT *T = new NodT;
int cmlpc(NodT *t, char *s, int l)
{
    if (*s == '\n') return l;
    if (t -> E[*s - 'a'] == 0) return l;
    return cmlpc(t -> E[*s - 'a'],s + 1,l + 1);
}
int query(NodT *t, char *s)
{
    char k;
    if (*s == '\n') return t -> n;
    k = *s - 'a';
    if (t -> E[k] != 0)
    return query(t -> E[k], s + 1);
     else return 0;
}
int del(NodT *t, char *s)
{
    char k;
    if (*s == '\n') t -> n--;
    else {
    k = *s - 'a';
    if (del(t -> E[k], s + 1))
     {
          t -> E[k] = 0;
          t -> nrf--;
     }
    }
    if (t -> nrf == 0 && t != T && t -> n == 0)
     {
         delete t;
         return 1;
     }
    return 0;
}
int insert(NodT *t, char *s)
{
    char k;
    if (*s == '\n') {t -> n++; return 0;}
     k = *s - 'a';
      if (t -> E[k] == 0)
       {
           t -> E[k] = new NodT;
           t -> nrf++;
        }
    insert(t->E[k],s+1);

}

int main()
{
    char l[50];
    freopen("grader_test1.in","r",stdin);
    freopen("trie.out","w",stdout);
    fgets(l,32, stdin);
    while (!feof(stdin))
     {
         if (l[0] == '0')
          insert(T, l+2);
         if (l[0] == '1')
          del(T, l+2);
         if (l[0] == '2')
          printf("%d \n",query(T,l+2));
         if (l[0] == '3')
          printf("%d \n",cmlpc(T, l+2, 0));
         fgets(l,32, stdin);
     }

    return 0;
}