Cod sursa(job #2034601)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 8 octombrie 2017 03:08:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.37 kb
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#define SIGMA 26

using namespace std;

struct Trie_vertex {

	unsigned int words, prefixes;
	Trie_vertex *edges[SIGMA];
	Trie_vertex() {

		words = prefixes = 0;
		memset(edges, 0, sizeof(Trie_vertex*) * SIGMA);
	}
};

void addWord(Trie_vertex *vertex, const string& word, unsigned int pos) {

	unsigned int indx;
	for (unsigned int i = pos; i < word.size(); i++) {

		indx = word[i] - 'a';
		if (vertex->edges[indx] == nullptr)
			vertex->edges[indx] = new Trie_vertex();
		vertex = vertex->edges[indx];
		vertex->prefixes++;
	}
	vertex->words++;
}

unsigned int countWords(Trie_vertex *vertex, const string& word, unsigned int pos) {

	unsigned int indx;
	for (unsigned int i = pos; i < word.size(); i++) {

		indx = word[i] - 'a';
		if (vertex->edges[indx] == nullptr)
			return 0;
		vertex = vertex->edges[indx];
	}
	return vertex->words;
}

unsigned int longestPrefix(Trie_vertex *vertex, const string& prefix, unsigned int pos) {

	unsigned int nr = 0, indx;
	for (unsigned int i = pos; i < prefix.size(); i++) {

		indx = prefix[i] - 'a';
		if (vertex->edges[indx] == nullptr)
			return nr;
		nr++;
		vertex = vertex->edges[indx];
	}
	return nr;
}

void deleteWord(Trie_vertex *&vertex, const string& word, unsigned int pos) {

	if (pos == word.size()) {

		vertex->words--;
		vertex->prefixes--;
		if (vertex->words + vertex->prefixes == 0) {

			delete vertex;
			vertex = nullptr;
		}

	}
	else {

		deleteWord(vertex->edges[word[pos] - 'a'], word, pos + 1);
		vertex->prefixes--;
		if (vertex->words + vertex->prefixes == 0) {

			delete vertex;
			vertex = nullptr;
		}
	}
}

void eraseTrie(Trie_vertex *&vertex) {

	for (unsigned int i = 0; i < SIGMA; i++)
		if (vertex->edges[i] != nullptr)
			eraseTrie(vertex->edges[i]);

	delete vertex;
	vertex = nullptr;
}

int main() {

	Trie_vertex *head = new Trie_vertex();
	ifstream in("trie.in");
	ofstream out("trie.out");
	string buffer;

	while (getline(in, buffer)) {

		switch (buffer[0]) {

		case '0': addWord(head, buffer, 2); break;
		case '1': deleteWord(head, buffer, 2); break;
		case '2': out << countWords(head, buffer, 2) << "\n"; break;
		case '3': out << longestPrefix(head, buffer, 2) << "\n"; break;
		}
	}

	eraseTrie(head);
	in.close();
	out.close();
}