Cod sursa(job #418770)

Utilizator iuly2freemanVasiliev Iulian iuly2freeman Data 16 martie 2010 13:14:10
Problema Trie Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>

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

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

trie* shit;
char a[100];

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, char *s)
{	
	vertex->prefixes++;
	
	if (*s == NULL) vertex->words++;
		
	else
	{
		int k = s[0] - 'a';
		if (!vertex->edges[k])
		{
			vertex->edges[k] = new trie;
			init(vertex->edges[k]);
		}
		addWord(vertex->edges[k], s + 1);
	}
}

int countWords(trie *& vertex, char *s)
{
	if (*s == NULL) return vertex->words;
	
	int k = s[0] - 'a';
	
	if (!vertex->edges[k]) return 0;
	
	return countWords(vertex->edges[k], s + 1);
}

bool deleteWord(trie *& vertex, char *s)
{	
	if (*s == NULL)
	{
		vertex->words--; vertex->prefixes--;
		if (!vertex->prefixes) vertex = NULL;
		return 1;
	}
	
	int k = s[0] - 'a';
	
	if (!vertex->edges[k]) return 0;
	
	bool ok = deleteWord(vertex->edges[k], s + 1);
	
	if (ok)
	{
		vertex->prefixes--;
		if (!vertex->prefixes) vertex = NULL;
	}
	
	return ok;
}

void longestPrefix(trie *& vertex, char *s, int &ret)
{
	if (*s == NULL) return;
	int k = s[0] - 'a';
	if (!vertex->edges[k]) return;
	ret++;
	
	longestPrefix(vertex->edges[k], s + 1, ret);
}

int main()
{	
	shit = new trie;
	init(shit);
	int pref;
	char r;
	
	while (fin >> r)
	{
        fin >> a;
        
		switch (r)
		{
            case '0' : addWord(shit, a); break;
            case '1' : deleteWord(shit, a); break;
            case '2' : fout << countWords(shit, a) << std::endl; break;
            case '3' :
            {
                pref = 0;
			    longestPrefix(shit, a, pref);
			    fout << pref << std::endl;  
                break;                
            }
		}
	}

	return 0;
}