Cod sursa(job #2034597)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 8 octombrie 2017 02:50:17
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <iostream>
#include <fstream>
#include <string>
#define SIGMA 26

using namespace std;

struct Trie_vertex {

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

		words = prefixes = 0;
		for (unsigned int i = 0; i < SIGMA; i++)
			edges[i] = nullptr;
	}
};

void addWord(Trie_vertex *vertex, const string& word, string::iterator& it) {

	for (; it != word.end(); ++it) {

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

unsigned int countWords(Trie_vertex *vertex, const string& word, string::iterator& it) {

	for (; it != word.end(); ++it) {

		if (vertex->edges[*it - 'a'] == nullptr)
			return 0;
		vertex = vertex->edges[*it - 'a'];
	}
	return vertex->words;
}

unsigned int longestPrefix(Trie_vertex *vertex, const string& prefix, string::iterator& it) {

	unsigned int nr = 0;
	for (; it != prefix.end(); ++it) {

		if (vertex->edges[*it - 'a'] == nullptr)
			return nr;
		nr++;
		vertex = vertex->edges[*it - 'a'];
	}
	return nr;
}

void deleteWord(Trie_vertex *&vertex, const string& word, string::iterator& it) {

	if (it == word.end()) {

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

			delete vertex;
			vertex = nullptr;
		}
	
	} else {
		
		deleteWord(vertex->edges[*it - 'a'], word, it + 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, buffer.begin() + 2); break;
			case '1': deleteWord(head, buffer, buffer.begin() + 2); break;
			case '2': out << countWords(head, buffer, buffer.begin() + 2) << "\n"; break;
			case '3': out << longestPrefix(head, buffer, buffer.begin() + 2) << "\n"; break;
		}
	}
	eraseTrie(head);
	in.close();
	out.close();
}