Cod sursa(job #251943)

Utilizator MciprianMMciprianM MciprianM Data 3 februarie 2009 17:46:00
Problema Trie Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<fstream>
#include<cstring>

#define h ( *s -'a' )

using namespace std;

struct Trie
{
  int nrfii, freq;
  Trie *fiu[ 26 ];
  Trie ()
  {
        nrfii=freq=0;
        memset( fiu, 0, sizeof( fiu ) );
  }
};

Trie* T=new Trie;

void insert ( Trie* t, char* s )
{
	if ( *s )
	{
		if (  t->fiu [ h ] == 0 )
		{
			t -> fiu [ h ] = new Trie;
			t->nrfii ++;
		}
		insert ( t->fiu [ h ], s+1 );
		return;
	}
	t -> freq++;
}

int del ( Trie* t, char *s )
{
	if( *s == 0 )
		t -> freq --;
	else
		if ( del ( t -> fiu [ h ], s+1 ) )
		{
			t -> nrfii --;
			t -> fiu [ h ] = 0; 
		}
		
	if ( t->freq == 0 && t -> nrfii == 0 && t != T )
	{
		delete t;
		return 1;
	}
	return 0;
}

int query_freq ( Trie* t, char* s )
{
	if( *s == 0 )
	  return t -> freq;
	if( t-> fiu [ h ] )
	  return query_freq ( t-> fiu [ h ], s+1 );
	return 0;
}

int query_prefix ( Trie* t, char* s, int k )
{
	if( t -> fiu [ h ] && s )
	  return query_prefix ( t -> fiu [ h ], s+1, k+1 );
	return k;
}

int main ( )
{
	char linie[32];
	ifstream f( "trie.in" );
	ofstream g( "trie.out" );
	while ( f.getline ( linie, 30, '\n' ) )
	{
	    switch ( linie [ 0 ] )
		{
			case '0':  insert ( T, linie+2 ); break;
			case '1':  del ( T, linie+2 ); break;
			case '2':  g << query_freq ( T, linie+2 ) << '\n'; break;
			case '3':  g<< query_prefix ( T, linie+2, 0 )<< '\n'; break;
		}
	}
	f.close ();
	g.close ();
	return 0;
}