Cod sursa(job #2034595)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 8 octombrie 2017 02:10:50
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 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;
	}
} *head;

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

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

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

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

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

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

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

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

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

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

	if (word.empty()) {

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

			delete vertex;
			vertex = nullptr;
		}
	
	} else {
		
		deleteWord(vertex->edges[word[0] - 'a'], move(word.substr(1)));
		vertex->prefixes--;
		if (vertex->words + vertex->prefixes == 0) {

			delete vertex;
			vertex = nullptr;
		}
	}
}


int main() {

	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, move(buffer.substr(2))); break;
			case '1': deleteWord(head, move(buffer.substr(2))); break;
			case '2': out << countWords(head, move(buffer.substr(2))) << "\n"; break;
			case '3': out << longestPrefix(head, move(buffer.substr(2))) << "\n"; break;
		}
	}
	in.close();
	out.close();
}