Cod sursa(job #418779)

Utilizator iuly2freemanVasiliev Iulian iuly2freeman Data 16 martie 2010 13:36:23
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>

#define POS (s[0] - 'a')

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

struct trie
{
	int words;
	int prefixes;
	trie* edges[26];
	trie()
    {
        words = prefixes = 0;
        memset(edges, NULL, sizeof(edges));
    }
};

trie* shit;
char a[100];

void addWord(trie *& vertex, char *s)
{	
	vertex->prefixes++;
	
	if (*s == NULL)
    {
        vertex->words++;
        return;
    }
	if (!vertex->edges[POS]) vertex->edges[POS] = new trie;
        
	addWord(vertex->edges[POS], s + 1);
}

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

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

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

int main()
{	
	shit = new trie;
	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;
}