Cod sursa(job #1163049)

Utilizator irimiecIrimie Catalin irimiec Data 1 aprilie 2014 09:44:11
Problema Trie Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 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 );
	
	return 0;
}

int main()
{
	char line[ 30 ];
	f.getline(line, 30);
	
	while( f.good( ) )
	{
		switch( line[0] )
		{
			case '0': ins(T, line + 2); break;
			case '1': del(T, line + 2); break;
			case '2': g << cat(T, line + 2) << "\n"; break;
			case '3': g << pre(T, line + 2, 0) << "\n"; break;
		}
		
		f.getline(line, 30);
	}
	
	return 0;
}