Cod sursa(job #406544)

Utilizator laserbeamBalan Catalin laserbeam Data 1 martie 2010 17:00:26
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

#define SIGMA 26

#define FIN "trie.in"
#define FOUT "trie.out"

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

Trie *T = new Trie;

void insert( char *s )
{
	Trie *nod = T;
	int q;
	do
	{
		if (*s == '\n') { nod->cnt++; return; }
		q = *s - 'a';
		if ( !nod->fii[q] )
		{
			nod->fii[q] = new Trie;
			nod->nrfii++;
		}
		
		s++;
		nod = nod->fii[q];
	} while (1);
}

bool del( Trie *nod, char *s )
{
	int q = *s-'a';
	if (*s == '\n') nod->cnt--;
	else if ( del( nod->fii[q], s+1 ) )
		nod->nrfii--, nod->fii[q] = 0;

	if (nod->cnt == 0 && nod->nrfii == 0 && nod != T)
	{
		delete nod; return true;
	}
	
	return false;
}

int numara( char *s )
{
	Trie *nod = T;
	int q;
	do
	{
		if (*s == '\n') 
		{
			return (nod->cnt);
		}
		q = *s-'a';
		if ( !nod->fii[q] ) return 0;
		nod = nod->fii[q];
		s++;
	} while (1);
}

int prefix( char *s )
{
	Trie *nod = T;
	int q,k=0;
	do
	{
		q = *s-'a';
		if (*s == '\n' || !nod->fii[q]) return k;
		k++;
		s++;
		nod = nod->fii[q];
	} while (1);
}


int main()
{

	freopen( FIN, "r", stdin );
	freopen( FOUT, "w", stdout );
	
	char line[32];
	fgets ( line, 32, stdin );
	
	while ( !feof( stdin ) )
	{
		switch (line[0])
		{
			case '0' : insert( line+2 ); break;
			case '1' : del( T, line+2 ); break;
			case '2' : printf ( "%d\n", numara( line+2 ) ); break;
			case '3' : printf ( "%d\n", prefix( line+2 ) ); break;
		}
		fprintf(stderr, "\n");
		fgets ( line, 32, stdin );
	}
	
	return EXIT_SUCCESS;
}