Cod sursa(job #1088322)

Utilizator fhandreiAndrei Hareza fhandrei Data 20 ianuarie 2014 14:36:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
// Include
#include <fstream>
#include <cstring>
using namespace std;

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

// Constante
const int sz = 21;
const int letters_sz = 26;

// Structuri
struct trie_t
{
	int words;
	int sons;
	trie_t *son[letters_sz];
	
	trie_t()
	{
		words = sons = 0;
		memset(son, '\0', sizeof(son));
	}
};

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

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

int type;
char currentWord[letters_sz];

trie_t *root = new trie_t;

// 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) << '\n'; break;	}
		}
	}
	
	in.close();
	out.close();
	return 0;
}

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

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

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

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