Cod sursa(job #428222)

Utilizator bixcabc abc bixc Data 29 martie 2010 00:00:44
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>
#include <string.h>

#define Lmax 22

struct Trie {
	int nr_cuv, nr_fii;
	Trie *fiu[26];
	
	Trie () {
		nr_cuv = 0, nr_fii = 0;
		memset (fiu, 0, sizeof (fiu));
	}
} *R;

int tip;
char cuv[Lmax];

void add_trie (Trie *rad, char *cuv) {
	
	if (*cuv == '\n') {
		rad->nr_cuv++;
		return ;
	}
	
	if (!rad->fiu[*cuv - 'a']) {
		rad->fiu[*cuv - 'a'] = new Trie;
		rad->nr_fii++;
	}
	
	add_trie (rad->fiu[*cuv - 'a'], cuv + 1);
}

int delete_trie (Trie *rad, char *cuv) {
	
	if (*cuv == '\n') {
		rad->nr_cuv--;
		if (rad != R && rad->nr_fii == 0 && rad->nr_cuv == 0) {
			delete rad;
			return 1;
		}
		
		return 0;
	}
	
	if (delete_trie ( rad->fiu[*cuv - 'a'], cuv + 1 )) {
		rad->nr_fii--;
		rad->fiu[*cuv - 'a'] = 0;
		if (rad != R && rad->nr_fii == 0 && rad->nr_cuv == 0) {
			delete rad;
			return 1;
		}
	}
	
	return 0;
}

int nr_query (Trie *rad, char *cuv) {
	
	if (*cuv == '\n') 
		return rad->nr_cuv;
	
	if (!rad->fiu[*cuv - 'a']) return 0;
	else return nr_query (rad->fiu[*cuv - 'a'], cuv + 1);
}

int prefix_query (Trie *rad, char *cuv, int lg) {
	
	if (*cuv == '\n') 
		return lg;
	
	if (!rad->fiu[*cuv - 'a']) return lg;
	return prefix_query (rad->fiu[*cuv - 'a'], cuv + 1, lg + 1);
}

int main () {

	FILE *f = fopen ("trie.in", "r");
	freopen ("trie.out", "w", stdout);

	cuv[0] = ' '; fscanf (f, "%d %s", &tip, cuv + 1);
	R = new Trie;
	while (!feof (f)) { 
		cuv[ strlen(cuv) ] = '\n';
		
		switch (tip) {
			case 0 : add_trie (R, cuv + 1); break;
			case 1 : delete_trie (R, cuv + 1); break;
			case 2 : printf ("%d\n", nr_query (R, cuv + 1)); break;
			case 3 : printf ("%d\n", prefix_query (R, cuv + 1, 0)); break; 
		}
		
		fscanf (f, "%d %s", &tip, cuv + 1);
	}
	
	fclose (f);	
	return 0;
}