Cod sursa(job #1533302)

Utilizator greenadexIulia Harasim greenadex Data 22 noiembrie 2015 13:08:24
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <cstring>
#include <string>

using namespace std;

const string file_name = "trie",
             in_file_name = file_name + ".in",
             out_file_name = file_name + ".out";
ifstream fin(in_file_name);
ofstream fout(out_file_name);

struct Node {
	int pre, cnt;
	Node *f[26];
	Node() {
		pre = cnt = 0;
		memset(f, 0, sizeof(f));
	}
};

void add_word(Node *node, int pos, string& word) {
	if (pos == word.size()) {
		node -> cnt++;
		return;
	}

	int letter = word[pos] - 'a';
	if (node -> f[letter] == NULL)
		node -> f[letter] = new Node();
	node -> f[letter] -> pre++;
	add_word(node -> f[letter], pos + 1, word);
}

void remove_word(Node *node, int pos, string& word) {
	if (pos == word.size()) {
		node -> cnt--;
		return;
	}

	int letter = word[pos] - 'a';
	node -> f[letter] -> pre--;
	remove_word(node -> f[letter], pos + 1, word);
}

int count_word(Node *node, int pos, string& word) {
	if (pos == word.size())
		return node -> cnt;

	int letter = word[pos] - 'a';
	if (node -> f[letter] == NULL)
		return 0;
	return count_word(node -> f[letter], pos + 1, word);
}

int count_prefix(Node *node, int pos, string& word) {
	if (pos == word.size())
		return word.size();

	int letter = word[pos] - 'a';
	if (node -> f[letter] == NULL || !(node -> f[letter] -> pre))
		return pos;
	return count_prefix(node -> f[letter], pos + 1, word);
}

int main() {
	int query;
	string word;
	Node *root = new Node();

	while (fin >> query >> word)
		switch (query) {
		case 0:
			add_word(root, 0, word);
			break;
		case 1:
			remove_word(root, 0, word);
			break;
		case 2:
			fout << count_word(root, 0, word) << '\n';
			break;
		case 3:
			fout << count_prefix(root, 0, word) << '\n';
			break;
		}
	return 0;
}