Cod sursa(job #283454)

Utilizator alecmanAchim Ioan Alexandru alecman Data 19 martie 2009 10:08:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
#include<string.h>

#define INPUT "trie.in"
#define OUTPUT "trie.out"

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

struct Trie
{
  int Letter, nrChild;
  Trie *Child[ 26 ];

  Trie(){
    Letter = 0, nrChild = 0;
    memset(Child, 0, sizeof(Child));
  }
};

Trie *Tr = new Trie;

void add(Trie* T, char* S)
{
  if(*S == '\n'){
    T -> Letter ++; return;
  }
  
  if(T -> Child[ *S - 'a' ] == 0)
  {
    T -> Child[ *S - 'a' ] = new Trie;
    T -> nrChild ++;
  }

  add(T -> Child[ *S - 'a' ], S+1);
}

int remove(Trie* T, char* S)
{
  if(*S == '\n')
    T -> Letter --;
  else
    if( remove(T -> Child[ *S - 'a' ], S+1))
    {
      T -> nrChild --;
      T -> Child[ *S -'a' ] = 0;
    }

  if(T -> nrChild == 0 && T -> Letter == 0 && T != Tr)
  {
    delete T;
    return 1;
  }

  return 0;
}

int number(Trie* T, char* S)
{
  if(*S == '\n')
    return T -> Letter;
  
  if(T -> Child[ *S - 'a' ])
    return number( T-> Child[ *S -'a'], S+1);
  return 0;
}

int prefix(Trie* T, char* S, int k)
{
  if(*S == '\n' || T -> Child[ *S -'a' ] == 0)
    return k;
  return prefix(T-> Child[ *S - 'a' ], S+1, k+1);
}

int main()
{
  char S[ 32 ];

  fgets( S, 32, fin);

  while(!feof(fin)){
    switch(S[ 0 ])
    {
      case '0': add(Tr, S+2); break;
      case '1': remove(Tr, S+2); break;
      case '2': fprintf(fout, "%d\n", number(Tr, S+2)); break;
      case '3': fprintf(fout, "%d\n", prefix(Tr, S+2, 0)); break;
    }

    fgets(S, 32, fin);
  }

  fclose(fin);
  fclose(fout);
}