Cod sursa(job #769789)

Utilizator ioana23Ioana Ioana ioana23 Data 20 iulie 2012 20:29:23
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <iostream>
#define Length 26

using namespace std;

struct Trie
{
	int word, prefix;
	Trie *ramura[26];

	Trie()
	{
		word = prefix = 0;
		memset( ramura, 0, sizeof(ramura) );
	}
};	

void addWord(Trie *trie , char *word)
{
	if (strcmp(word,"\0") == 0)
	{
		trie->word++;
		return;
	}
	trie->prefix++;
	short character = word[0] - 'a';
	if (trie->ramura[character] == NULL)
		trie->ramura[character] = new Trie;
	strcpy(word, word+1);
	addWord(trie->ramura[character], word);
}

int numberWords(Trie *trie, char *word)
{
	if (strcmp(word, "\0") == 0)
		return trie->word;
	else
	{
		short character = word[0] - 'a';
		if (trie->ramura[character] == NULL)
			return 0;
		strcpy(word, word+1);
		return numberWords(trie->ramura[character], word);
	}
}

int numberPrefixes(Trie *trie, char *word, int k)
{
	if (strcmp(word, "\0") == 0)
		return k;
	else
	{
		short character = word[0] - 'a';
		if (trie->ramura[character] == NULL || (trie->ramura[character]->prefix == 0 && trie->ramura[character]->word == 0))
			return k;
		strcpy(word, word+1);
		return numberPrefixes(trie->ramura[character], word, k+1);
	}
}

void deleteWord (Trie *trie, char *word)
{
	if (strcmp(word, "\0") == 0)
	{
		trie->word--;
		if (trie->prefix == 0 && trie->word == 0)
		{
			trie = NULL;
			return;
		}
	}
	else	
	{
		trie->prefix--;
		short character = word[0] - 'a';
		strcpy(word, word+1);
		deleteWord(trie->ramura[character], word);
	}
}

void trieFunction()
{
	Trie *trie = new Trie;

	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);

	char number, word[20];
	while (!cin.eof())
	{
		cin>>number>>word;
		switch(number)
		{
		case '0': addWord(trie, word);
				break;
		case '1': char wordaux[20];
				  strcpy(wordaux, word);
				  if (numberWords(trie, wordaux) != 0)
						deleteWord(trie, word);
				break;
		case '2': cout<<numberWords(trie, word)<<"\n";
				break;
		case '3': cout<<numberPrefixes(trie, word, 0)<<"\n";
				break;

		}
	}
}

int main ()
{
	trieFunction();
	return 0;
}