Cod sursa(job #418703)

Utilizator iuly2freemanVasiliev Iulian iuly2freeman Data 16 martie 2010 11:50:40
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
//#include <iostream>
#include <string>
#include <fstream>

std::ifstream fin("trie.in");
std::ofstream fout("trie.out");

struct trie
{
	int words;
	int prefixes;
	trie* edges[26];
};

trie* shit;

void init(trie *& vertex)
{
	vertex->words = 0;
	vertex->prefixes = 0;
	for (int i = 0; i < 26; ++i) vertex->edges[i] = NULL;
}

void addWord(trie *& vertex, std::string word)
{	
	vertex->prefixes++;
	
	if (word.length() == 0) vertex->words++;
		
	else
	{
		int k = word[0] - 'a';
		if (!vertex->edges[k])
		{
			vertex->edges[k] = new trie;
			init(vertex->edges[k]);
		}
		word.erase(0, 1);
		addWord(vertex->edges[k], word);
	}
}

int countWords(trie *& vertex, std::string word)
{
	if (word.length() == 0) return vertex->words;
	
	int k = word[0] - 'a';
	
	if (!vertex->edges[k]) return 0;
	
	word.erase(0, 1);
	return countWords(vertex->edges[k], word);
}

bool deleteWord(trie *& vertex, std::string word)
{	
	if (word.length() == 0)
	{
		vertex->words--;
		if (!vertex->words) vertex = NULL;
		return 1;
	}
	
	int k = word[0] - 'a';
	
	if (!vertex->edges[k]) return 0;
	
	word.erase(0, 1);
	
	bool ok = deleteWord(vertex->edges[k], word);
	
	if (ok)
	{
		vertex->prefixes--;
		if (!vertex->prefixes) vertex = NULL;
	}
	
	return ok;
}

void longestPrefix(trie *& vertex, std::string word, int &ret)
{
	if (word.length() == 0) return;
	int k = word[0] - 'a';
	if (!vertex->edges[k]) return;
	ret++;
	word.erase(0, 1);
	longestPrefix(vertex->edges[k], word, ret);
}

int main()
{
	int reponse = 0;
	std::string word;
	
	shit = new trie;
	init(shit);
	int pref;
	
	while (fin >> reponse)
	{
		
		if (reponse == 0)
		{
			fin >> word;
			addWord(shit, word);
		}
		if (reponse == 2)
		{
			fin >> word;
		    fout << countWords(shit, word) << std::endl;
		}
		if (reponse == 1)
		{
			fin >> word;
			deleteWord(shit, word);
		}
		if (reponse == 3)
		{
			fin >> word; pref = 0;
			longestPrefix(shit, word, pref);
			fout << pref << std::endl;
		}
	}

	return 0;
}