Cod sursa(job #615237)

Utilizator vladbagrinVlad Bagrin vladbagrin Data 8 octombrie 2011 23:45:24
Problema Trie Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.74 kb
#include <stdio.h>
#include <stdlib.h>

#define INPUT "trie.in"
#define OUTPUT "trie.out"
#define SIGMA 26
#define MAX 21
#define SUCCESS 0

typedef struct _node {
	int words;
	int prefs;
	struct _node* edges[SIGMA];
} node;

node* init() {
	node* n = (node*) malloc(sizeof(node));
	n->prefs = n->words = 0;
	int i;
	for (i = 0; i < SIGMA; i++) {
		n->edges[i] = NULL;
	}
	return n;
}

void cleanup(node* v) {
	int i;
	for (i = 0; i < SIGMA; i++) {
		if (v->edges[i]) {
			cleanup(v->edges[i]);
		}
	}
	free(v);
}

void insert(node* v, char* word) {
	if (!word[0]) {
		v->words++;
	} else {
		int k = word[0] - 'a';
		v->prefs++;
		if (!v->edges[k]) {
			v->edges[k] = init();
		}
		insert(v->edges[k], word + 1);
	}
}

void rem(node* v, char* word) {
	if (!word[0])
		v->words--;
	else {
		v->prefs--;
		int k = word[0] - 'a';
		node* e = v->edges[k];
		rem(e, word + 1);
		if (!e->words && !e->prefs) {
			free(e);
			v->edges[k] = NULL;
		}
	}
}

int words(node* v, char* word) {
	if (!word[0])
		return v->words;
	else {
		int k = word[0] - 'a';
		if (v->edges[k])
			return words(v->edges[k], word + 1);
		else
			return 0;
	}
}

int prefix(node* v, char* word) {
	if (!word[0])
		return 0;
	else {
		int k = word[0] - 'a';
		if (v->edges[k])
			return 1 + prefix(v->edges[k], word + 1);
		else
			return 0;
	}
}

int main() {
	freopen(INPUT, "r", stdin);
	freopen(OUTPUT, "w", stdout);

	node* v = init();
	while (!feof(stdin)) {
		int op;
		char word[MAX];
		scanf("%d %s\n", &op, word);
		switch (op) {
			case 0:
				insert(v, word);
				break;
			case 1:
				rem(v, word);
				break;
			case 2:
				printf("%d\n", words(v, word));
				break;
			case 3:
				printf("%d\n", prefix(v, word));
				break;
		}
	}
	cleanup(v);

	fclose(stdin);
	fclose(stdout);
	return SUCCESS;
}