Cod sursa(job #956307)

Utilizator sorin2kSorin Nutu sorin2k Data 2 iunie 2013 19:41:00
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<fstream>
#include<iostream>
using namespace std;

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

int i, opt;
char text[21];

struct Trie {
	int prefix, word;
	Trie *succ[26];
	Trie()
	{
		prefix = 0;
		word = 0;
		for(i = 0; i < 26; i++)
			succ[i] = 0;
	}
};

void addWord(Trie *nod, char *sir)
{
	if(sir[0] == '\0')
	{
		nod->word++;
		nod->prefix++;
	}
	else
	{
		nod->prefix += 1;
		if(nod->succ[sir[0] - 'a'] == 0) // daca nu exista un succesor cu litera curenta
		{
			nod->succ[sir[0] - 'a'] = new Trie;
		}	
		addWord(nod->succ[sir[0] - 'a'], sir + 1);
	}
}

int longestPrefix(Trie *nod, char *sir, int k)
{
	if(nod == 0 || sir[0] == '\0' || !nod->succ[sir[0] - 'a'])
		return k;
	else
		return longestPrefix(nod->succ[sir[0] - 'a'], sir + 1, k + 1);
}

int wordCount(Trie *nod, char *sir)
{
	if(nod == 0) // daca nu exista cuvantul in arbore returnam 0
		return 0;
	else
	{
		if(sir[0] == '\0') // inseamna ca suntem pe nodul caracterului din finalul cuvantului 
			return nod->word;
		else // mergem pe fiul corespunzator caracterului urmator, micsorand sirul
		{
			return wordCount(nod->succ[sir[0] - 'a'], sir + 1);
		}
	}
}

void remove(Trie *nod, char *sir)
{
	if(sir[0] != '\0')
	{
		remove(nod->succ[sir[0] - 'a'], sir + 1);
		if(nod->succ[sir[0] - 'a']->prefix == 0 && nod->succ[sir[0] - 'a']->word == 0)
		{
			delete nod->succ[sir[0] - 'a'];
			nod->succ[sir[0] - 'a'] = 0;
		}
		nod->prefix--;
	}
	else
	{
		nod->word--;
		nod->prefix--;
	}
}

int main()
{
	Trie *rad = new Trie;
	while(fin >> opt >> text)
	{
		switch(opt)
		{
		case 0:
			addWord(rad, text);
			break;
		case 1:
			remove(rad, text);
			break;
		case 2:
			fout << wordCount(rad, text) << '\n';
			break;
		case 3:
			fout << longestPrefix(rad, text, 0) << '\n';
		}
	}
	return 0;
}