Cod sursa(job #757703)

Utilizator fhandreiAndrei Hareza fhandrei Data 13 iunie 2012 00:14:20
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
//Include
#include <fstream>
using namespace std;

//Definitii
#define letter (*word - 'a')

//Constante
const int MAX_SIZE = 22;
const int LETTERS = 26;

//Structuri
struct trie
{
	int words;
	int sons;
	trie *son[LETTERS];
	
	trie()
	{
		words = sons = 0;
		memset(son, 0, sizeof(son));
	}
};

//Functii
void insert(trie *node, char *word);
bool erase(trie *node, char *word);
int query(trie *node, char *word);
int prefix(trie *node, char *word, int length);

//Variabile
ifstream in("trie.in");
ofstream out("trie.out");

int type;
char currentWord[MAX_SIZE];
trie *root = new trie;

//Main
int main()
{
	while(in >> type >> currentWord)
	{
		switch(type)
		{
		case 0: {	insert(root, currentWord); break;	}
		case 1: {	erase(root, currentWord); break;	}
		case 2: {	out << query(root, currentWord) << '\n'; break; 	}
		case 3: {	out << prefix(root, currentWord, 0) << '\n'; break;	}
		}
		
	}
	
	in.close();
	out.close();
	return 0;
}

void insert(trie *node, char *word)
{
	if(!*word)
	{
		++node->words;
		return ;
	}
	
	if(!node->son[letter])
	{
		++node->sons;
		node->son[letter] = new trie;
	}
	
	insert(node->son[letter], word+1);
}

bool erase(trie *node, char *word)
{
	if(!*word)
		--node->words;
	else if(erase(node->son[letter], word+1))
	{
		node->son[letter] = false;
		--node->sons;
	}
	
	if(node->sons || node == root || node->words)
		return false;
	
	delete node;
	return true;
}

int query(trie *node, char *word)
{
	if(!*word)
		return node->words;
	
	if(node->son[letter])
		return query(node->son[letter], word+1);
	return 0;
}

int prefix(trie *node, char *word, int length)
{
	if(!*word || !node->son[letter])
		return length;
	return prefix(node->son[letter], word+1, length+1);
}