Cod sursa(job #344229)

Utilizator digital_phreakMolache Andrei digital_phreak Data 29 august 2009 10:59:42
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
using namespace std;

struct Trie {
	int cnt,nrfii;
	Trie* nodes[26];
	Trie() {
		cnt=nrfii=0;
		memset(nodes,0,sizeof(nodes));
	}
};

Trie* root = new Trie();

inline bool alpha(char c) {
	return (c >= 'a' && c <= 'z');
}

void trie_insert(Trie* node,char* s) {
	if (!alpha(*s)) {node->cnt++;return;}
	if (node->nodes[*s-'a'] == 0) node->nodes[*s-'a'] = new Trie,node->nrfii++;
	trie_insert(node->nodes[*s-'a'],s+1);
}

int trie_delete(Trie* node,char* s) {
	if (!alpha(*s)) node->cnt--;
	else if (trie_delete(node->nodes[*s-'a'],s+1)) {
		node->nodes[*s-'a'] = 0;
		node->nrfii--;
	}
	if (node->cnt==0 && node->nrfii==0 && node != root) {
		delete node;return 1;
	}
	return 0;
}

int trie_query(Trie* node,char* s) {
	if (!alpha(*s)) return node->cnt;
	if (node->nodes[*s-'a']) return trie_query(node->nodes[*s-'a'],s+1);
	return 0;
}

int trie_prefix(Trie* node,char *s,int k) {
	if (!alpha(*s) || (node->nodes[*s-'a'] == 0)) return k;
	return trie_prefix(node->nodes[*s-'a'],s+1,k+1);
}

int main() {	
	
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	
	char s[256];
	
	while (!feof(stdin)) {
				fgets(s,256,stdin);
				switch (s[0]) {
					case '0': trie_insert(root, s+2);break;
					case '1': trie_delete(root, s+2);break;
					case '2': printf("%d\n",trie_query(root, s+2));break;
					case '3': printf("%d\n",trie_prefix(root, s+2, 0)); break;
				}
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}