Cod sursa(job #251892)

Utilizator MciprianMMciprianM MciprianM Data 3 februarie 2009 16:07:16
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>

#define h ( *s -'a' )

using namespace std;

struct Trie
{
  int nrfii, freq;
  Trie *fiu[32];
  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 ] )
		{
			++t->nrfii;
			t -> fiu [ h ] = new Trie;
		}
		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 ] ) )
		{
			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;
}