Cod sursa(job #530896)

Utilizator icepowdahTudor Didilescu icepowdah Data 8 februarie 2011 16:53:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
using namespace std;

struct nod {
	int as_word;
	int as_prefix;
	nod* sons[26];
	nod() {
		as_word = as_prefix = 0;
		for (int i=0;i<26;i++) sons[i] = NULL;
	}
};
nod* root = new nod;

void insert_word(char word[]) {	
	nod* tmp = root;
	for (int i=0;word[i]!='\0';i++) {
		tmp->as_prefix++;
		if (tmp->sons[word[i]-'a'] == NULL) {
			tmp->sons[word[i]-'a'] = new nod;
		}
		tmp = tmp->sons[word[i]-'a'];		
	}
	tmp->as_prefix++;
	tmp->as_word++;	
}

void remove_word(char word[], int poz, nod*& curr) {
	if (word[poz]=='\0') {
		curr->as_word--;
		curr->as_prefix--;
	}
	else {
		int son_idx = word[poz]-'a';		
		remove_word(word,poz+1,curr->sons[son_idx]);
		curr->as_prefix--;
		if (curr->sons[son_idx]->as_word == 0 && curr->sons[son_idx]->as_prefix == 0) {
			delete curr->sons[son_idx];
			curr->sons[son_idx] = NULL;
		}
	}
}

int apparitions_count(char word[]) {	
	nod* tmp = root;
	for (int i=0;word[i]!='\0';i++) {		
		if (tmp->sons[word[i]-'a'] == NULL) {
			return 0;
		}
		tmp = tmp->sons[word[i]-'a'];
	}
	return tmp->as_word;
}

int max_prefix_len(char word[]) {
	int i;
	nod* tmp = root;
	for (i=0;word[i]!='\0';i++) {		
		if (tmp->sons[word[i]-'a'] == NULL) {
			break;
		}
		tmp = tmp->sons[word[i]-'a'];
	}
	return i;
}

int main() {
	int op;
	char word[21];	
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);	
	while (scanf("%d %s",&op,&word)!=EOF) {
		switch(op) {
		case 0:
			insert_word(word);
			break;
		case 1:
			remove_word(word,0,root);
			break;
		case 2:
			printf("%d\n",apparitions_count(word));
			break;
		case 3:
			printf("%d\n",max_prefix_len(word));
			break;
		}
	}
	return 0;
}