Cod sursa(job #531465)

Utilizator Gaby_mMititelu Gabriel Gaby_m Data 9 februarie 2011 18:41:31
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<cstdio>
#include<cstring>
using namespace std;

struct trie {
	int words;
	int prefix;
	trie *edge[26];
	trie() {
		words = prefix = 0;
		for (int i = 0; i < 26; i++) edge[i] = NULL;
	}
};


trie *root = new trie;

void insert(trie *node, char *s) {		
	int ch = s[0] - 'a';
	
	if (node->edge[ch] == NULL) node->edge[ch] = new trie;
	
	node->edge[ch]->prefix++;

	if (strlen(s) == 1)	node->edge[ch]->words++;	
	else if (strlen(s) > 1) insert(node->edge[ch], s+1);		
}

void del(trie *node, char *s) {
	int ch = s[0] - 'a';	
	node->edge[ch]->prefix--;
	if (strlen(s) == 1)	node->edge[ch]->words--;	
	else if (strlen(s) > 1) del(node->edge[ch], s+1);		
}

int words(trie *node, char *s) {
	if (!node) return 0;
	int ch = s[0] - 'a';		
	if (strlen(s) == 1)	return node->edge[ch]->words;	
	else if (strlen(s) > 1) words(node->edge[ch], s+1);		
}

int prefixes(trie *node, char *s, int depth) {	
	int ch = s[0] - 'a';		
	if ((!node->edge[ch])||(node->edge[ch]->prefix == 0)||(strlen(s) == 0)) return depth;		
	else if (strlen(s) > 0) prefixes(node->edge[ch], s+1, depth + 1);	
}


int main() {
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	int op;
	char s[32];
	scanf("%d %s", &op, s);
	while (!feof(stdin)) {		
		switch (op) {
			case 0: insert(root, s); break;
			case 1: del(root, s); break;
			case 2: printf("%d\n", words(root,s)); break;
			case 3: printf("%d\n", prefixes(root, s, 0)); break;
			default: break;
		}
		scanf("%d %s", &op, s);
	}
	return 0;
}