Cod sursa(job #1339016)

Utilizator Mr.DoomRaul Ignatus Mr.Doom Data 10 februarie 2015 16:41:41
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <cstring>
using namespace std;

ifstream is("trie.in");
ofstream os("trie.out");

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


Trie *T = new Trie;
int op;

void Insert(Trie *node, char *s);
bool Delete(Trie *node, char *s);
int Queue(Trie *node, char *s);
int Prefix(Trie *node, char *s, int k);

int main()
{
	char cuv[32];
	while ( is.getline(cuv, 32) )
	{
		op = cuv[0] - '0';
		switch( op )
		{
			case 0 :
				Insert(T, cuv + 2);
				break;
			case 1 : 
				Delete(T, cuv + 2);
				break;
			case 2 : 
				os << Queue(T, cuv + 2) << '\n';
				break;
			case 3 :
				os << Prefix(T, cuv + 2, 0) << '\n';
				break;
		}
	}
	
	is.close();
	os.close();
	return 0;
}

void Insert(Trie *node, char *s)
{
	if ( *s == '\0' )
	{
		node->cnt++;
		return;
	}
	
	if ( node->fii[*s - 'a'] == 0 )
	{
		node->fii[*s - 'a'] = new Trie;
		node->nrfii++;
	}
	
	Insert(node->fii[*s - 'a'], s + 1);
}

bool Delete(Trie *node, char *s)
{
	if ( *s == '\0' )
		node->cnt--;
	else
		if ( Delete(node->fii[*s - 'a'], s + 1) )
		{
			node->fii[*s - 'a'] = 0;
			node->cnt--;
		}
	
	if ( !node->cnt && !node->nrfii && node != T )
	{
		delete node;
		return 1;
	}
	return 0;
}

int Queue(Trie *node, char *s)
{
	if ( *s == '\0' )
		return node->cnt;
	if ( node->fii[*s - 'a'] )
		return Queue(node->fii[*s - 'a'], s + 1);
	return 0;
}
int Prefix(Trie *node, char *s, int k)
{
	if ( *s == '\0' || !node->fii[*s - 'a'] )
		return k;
	return Prefix(node->fii[*s - 'a'], s + 1, k + 1);
}