Cod sursa(job #769890)

Utilizator ioana23Ioana Ioana ioana23 Data 21 iulie 2012 11:42:11
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <cstdio>
#include <cstring>
#define character (*word - 'a')

using namespace std;

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

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

void addWord(Trie *trie , char *word)
{
	if (*word == '\0')
	{
		trie->word++;
		return;
	}
	if (trie->ramura[character] == 0)
	{
		trie->ramura[character] = new Trie;
		trie->numar++;
	}
	addWord(trie->ramura[character], word+1);
}

int numberWords(Trie *trie, char *word)
{
	if (*word == '\0')
		return trie->word;
	if (trie->ramura[character] == 0)
		return 0;
	return numberWords(trie->ramura[character], word+1);
}

int numberPrefixes(Trie *trie, char *word, int k)
{
	if (*word == '\0')
		return k;
	else
	{
		if (trie->ramura[character] == 0)
			return k;
		return numberPrefixes(trie->ramura[character], word+1, k+1);
	}
}

int deleteWord (Trie *trie, char *word)
{
	if (*word == '\0')
		trie->word--;
	else if ( deleteWord(trie->ramura[character], word + 1) )
	{
		trie->ramura[character] = 0;
		trie->numar--;
	}
	if (trie->word == 0 && trie->numar == 0)
	{
		delete trie;
		return 1;
	}
	return 0;
}

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

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

	short number;
	char word[20];
	char line[32], *p, option;
	while (!fin.eof())
	{
		//fin>>number>>word;
		fin.getline(line, 100);
		p = strtok(line, " ");
		option = p[0];
		p = strtok(NULL, "\n");
		strcpy(word, p);
		switch(option)
		{
		case '0': addWord(trieCuvant, word);
				break;
		case '1': deleteWord(trieCuvant, word);
				break;
		case '2': fout<<numberWords(trieCuvant, word)<<"\n";
				break;
		case '3': fout<<numberPrefixes(trieCuvant, word, 0)<<"\n";
				break;
		}
		}
	fin.close();
	fout.close();
}

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