Cod sursa(job #455442)

Utilizator bixcabc abc bixc Data 13 mai 2010 20:06:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <string>

#define Lmax 22

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

char cuv[Lmax];

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

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

int numara (Trie* &nod, char *cuv) {
	
	if (*cuv == '\n') 
		return nod->nr_cuv;
	
	if (nod->fii[(*cuv) - 'a'] == 0) 
		return 0;
	
	return  numara (nod->fii[(*cuv) - 'a'], cuv + 1);
}

int prefix (Trie* &nod, char *cuv, int l) {
	
	if (nod->fii[(*cuv) - 'a'] == 0 || *cuv == '\n') 
		return l;
	
	return prefix (nod->fii[(*cuv) - 'a'], cuv + 1, l + 1);
}

int main () {

	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	
	int tip;
	
	R = new Trie ();
	
	scanf ("%d %s", &tip, cuv); 
	cuv[strlen(cuv)] = '\n';
	
	while (!feof (stdin)) {
		
		if (tip == 0) 
			add (R, cuv);
		if (tip == 1) 
			erase (R, cuv);
		if (tip == 2)
			printf ("%d\n", numara (R, cuv));
		if (tip == 3)
			printf ("%d\n", prefix (R, cuv, 0));
		
		scanf ("%d %s", &tip, cuv);
		cuv[strlen(cuv)] = '\n';
	}
	
	return 0;
}