Cod sursa(job #1163088)

Utilizator irimiecIrimie Catalin irimiec Data 1 aprilie 2014 10:10:05
Problema Trie Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define CH (*p - 'a')

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

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

Trie *T = new Trie;

void ins( Trie *nod, char *p )
{
	if( *p == '\0' )
	{
		nod->cnt++;
		return;
	}
	
	if(nod->fiu[ CH ] == 0)
	{
		nod->fiu[ CH ] = new Trie;
		nod->nrfii++;
	}
	
	ins( nod->fiu[ CH ], p+1 );
}

int del( Trie *nod, char *p )
{
	if( *p == '\0' )
		nod->cnt--;
	else if ( del( nod->fiu[ CH ], p + 1 ) )
	{
		nod->fiu[ CH ] = 0;
		nod->nrfii--;
	}
	
	if( nod->cnt == 0 && nod->nrfii == 0 && nod != T)
	{
		delete nod;
		return 1;
	}
	
	return 0;
}

int cat( Trie *nod, char *p )
{
	if( *p == '\0' )
		return nod->cnt;
	
	if( nod->fiu[ CH ] )
		return cat( nod->fiu[ CH ], p+1 );
	
	return 0;
}

int pre(Trie *nod, char *p, int k)
{
	if( *p == '\n' || nod->fiu[ CH ] == 0 )
		return k;
	else
		return pre( nod->fiu[ CH ], p + 1, k + 1 );
}

int main()
{
	int type = 0;
	char line[ 22 ];
	
	while( f >> type )
	{
		f >> line;
		switch( type )
		{
			case 0: ins( T, line ); break;
			case 1: del( T, line ); break;
			case 2: g << cat( T, line ) << "\n"; break;
			case 3: g << pre( T, line, 0 ) << "\n"; break;
		}
	}
	
	return 0;
}