Cod sursa(job #1455308)

Utilizator GilgodRobert B Gilgod Data 27 iunie 2015 15:35:46
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <fstream>
#include <assert.h>

const char IN[] = "trie.in", OUT[] = "trie.out";
const int MAXLEN = 20;
const int ALPHABET = 26;
using namespace std;

struct node{
	int freq, succs_count;
	node* succs[ALPHABET];
};

node *tree;

void add_word(node* crt_node, char *c) {
	if (*c == '\n' || *c == '\0') {
		++crt_node->freq;
		return;
	}
	int key = *c - 'a';
	if (crt_node->succs[key] != NULL)
		add_word(crt_node->succs[key], ++c);
	else {
		++crt_node->succs_count;
		crt_node->succs[key] = new node();
		crt_node->succs[key]->freq = 0;
		add_word(crt_node->succs[key], ++c);
	}
}

int remove_word(node *crt_node, char *c) {
	if (*c == '\n' || *c == '\0') {
		--crt_node->freq;
		if (crt_node->freq == 0 && crt_node->succs_count == 0 && crt_node != tree) {
			delete crt_node;
			return 1;
		}
		return 0;
	}
	int key = *c - 'a';
	if (remove_word(crt_node->succs[key], c + 1)) {
		--crt_node->succs_count;
		crt_node->succs[key] = NULL;
	}
	if (crt_node->freq == 0 && crt_node->succs_count == 0
		&& crt_node != tree) {
		delete crt_node;
		return 1;
	}
	return 0;
}

int count_app(node *crt_node, char *c) {
	if (*c == '\0' || *c == '\n') return crt_node->freq;
	int key = *c - 'a';
	if (crt_node->succs[key] == NULL) return 0;
	else return count_app(crt_node->succs[key], ++c);
} 

int largest_prefix(node *crt_node, char *c) {
	if (*c == '\n' || *c == '\0') return 0;
	int key = *c - 'a';
	if (crt_node->succs[key] == NULL) return 0;
	else return 1 + largest_prefix(crt_node->succs[key], c + 1);
}

inline void read_data() {
	int op;
	char word[MAXLEN];
	while ((scanf("%d %s", &op, word)) == 2) {
		switch (op) {
		case 0: add_word(tree, word);  break;
		case 1: remove_word(tree, word);  break;
		case 2: printf("%d\n",count_app(tree, word)); break;
		case 3: printf("%d\n", largest_prefix(tree, word)); break;
		}
	}
}

int main() {
	freopen(IN, "r", stdin);
	freopen(OUT, "w", stdout);
	tree = new node();
	tree->freq = 0;
	read_data();
	fclose(stdin);
	fclose(stdout);
}