Cod sursa(job #1838276)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 31 decembrie 2016 16:53:56
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <string>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct TrieNode {
	TrieNode* edges[26];
	int count;
	int children;

	TrieNode() {
		count = 0;
		children = 0;
		memset(edges, 0, sizeof edges);
	}
};

TrieNode* root;
char tmp[20];
int cmd;

TrieNode* create_new_node()
{
	TrieNode* newNode = new TrieNode;
	return newNode;
}

void insert_new_word(char (&newWord)[20])
{
	TrieNode* crtNode = root;
	int newWordLen = strlen(newWord);

	for (int i = 0; i < newWordLen; i++) {
		if (crtNode->edges[newWord[i] - 'a'] == nullptr) {
			crtNode->edges[newWord[i] - 'a'] = create_new_node();
			crtNode->children++;
		}

		crtNode = crtNode->edges[newWord[i] - 'a'];
	}

	crtNode->count++;
}

bool delete_word(TrieNode* crtNode, char (&word)[20], int pos, int len)
{
	if (pos == len)
		crtNode->count--;
	else if (delete_word(crtNode->edges[word[pos] - 'a'], word, pos + 1, len)) {
		crtNode->edges[word[pos] - 'a'] = nullptr;
		crtNode->children--;
	}

	if (crtNode->count == 0 && crtNode->children == 0 && crtNode != root) {
		delete crtNode;
		return true;
	}	
	else
		return false;
}

int number_of_occurences(char(&word)[20])
{
	TrieNode* crtNode = root;
	int newWordLen = strlen(word);

	for (int i = 0; i < newWordLen; i++)
		crtNode = crtNode->edges[word[i] - 'a'];

	return crtNode->count;
}

int longest_prefix(char(&word)[20])
{
	TrieNode* crtNode = root;
	int newWordLen = strlen(word);

	int cnt = 0;
	for (int i = 0; i < newWordLen; i++, cnt++) {
		if (crtNode->edges[word[i] - 'a'] != nullptr)
			crtNode = crtNode->edges[word[i] - 'a'];
		else
			break;
	}

	return cnt;
}

int main()
{
	root = create_new_node();

	while (f >> cmd) {
		f >> tmp;

		switch (cmd)
		{
		case 0:
			insert_new_word(tmp);
			break;
		case 1:
			delete_word(root, tmp, 0, strlen(tmp));
			break;
		case 2:
			g << number_of_occurences(tmp) << "\n";
			break;
		case 3:
			g << longest_prefix(tmp) << "\n";
			break;
		}
	}
}