Cod sursa(job #519861)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 6 ianuarie 2011 18:32:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <cstdio>
#include <string.h>

using namespace std;

#define TRIE_D 26
#define LINE_D 32
#define IMP "trie.in"
#define OUTP "trie.out"

struct Trie
{
 int contor, nr_fii;
 Trie *fiu [ TRIE_D ];

 Trie()
 {
  contor = nr_fii = 0;
  memset( fiu, 0, sizeof( fiu ) );
 }
};

Trie *T = new Trie;

inline int caracter ( char * );
void insert_0( Trie * , char * );
int delete_1( Trie * , char * );
int queue_2( Trie * , char * );
int prefix_3( Trie * , char * , int );

int main()
{
 char line[ LINE_D ];

 freopen( IMP , "r" , stdin );
 freopen( OUTP , "w" , stdout );

 fgets( line, LINE_D , stdin );

 while( !feof( stdin ) )
 {
  switch( line[0] )
  {

   case '0': {
              insert_0( T, line+2 );
              break;
             }

   case '1': {
              delete_1( T, line+2 );
              break;
             }

   case '2': {
              printf( "%d\n", queue_2( T, line+2 ) );
              break;
             }

   case '3': {
              printf( "%d\n", prefix_3( T, line+2, 0 ) );
              break;
             }
  }

  fgets( line, LINE_D , stdin );
 }
 return 0;
}


inline int caracter ( char *s )
{
 return (*s - 'a');
}

void insert_0( Trie *nod, char *s )
{
 if( *s == '\n' )
 {
  nod->contor ++;
  return;
 }

 if( nod->fiu[ caracter(s) ] == 0 )
 {
  nod->fiu[ caracter(s) ] = new Trie;
  nod->nr_fii ++;
 }

 insert_0( nod->fiu[ caracter(s) ], s+1 );
}

int delete_1( Trie *nod, char *s )
{
 if( *s == '\n' )
  nod->contor --;
 else
  if( delete_1( nod->fiu[ caracter(s) ], s+1 ) )
  {
   nod->fiu[ caracter(s) ] = 0;
   nod->nr_fii --;
  }

 if( nod->contor == 0 && nod->nr_fii == 0 && nod != T )
 {
  delete nod;
  return 1;
 }
 return 0;
}

int queue_2( Trie *nod, char *s )
{
 if( *s == '\n' )
  return nod->contor;

 if( nod->fiu[ caracter(s) ] )
  return queue_2( nod->fiu[ caracter(s) ], s+1 );

 return 0;
}

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