Cod sursa(job #538559)

Utilizator Addy.Adrian Draghici Addy. Data 21 februarie 2011 17:50:02
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <cstring>

struct trie {
	int nr_cuv, nr_fii;
	trie *fii[26];
	
	trie () {
		nr_cuv = nr_fii = 0;
		memset (fii, 0, sizeof (fii));
	}
};

char V[32];
trie *R = new trie;

void adauga (trie*, char*);
int sterge (trie*, char*), query (trie*, char*), prefix (trie*, char*, int);

int main () {
	
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	
	fgets (V, 32, stdin);
	while (!feof (stdin)) {
		if (V[0] == '0') adauga (R, V + 2);
		if (V[0] == '1') sterge (R, V + 2);
		if (V[0] == '2') printf ("%d\n", query (R, V + 2));
		if (V[0] == '3') printf ("%d\n", prefix (R, V + 2, 0));
		
		fgets (V, 32, stdin);
	}
	
	return 0;
}

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

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

int query (trie *nod, char *p) {
	
	if (*p == '\n')
		return nod -> nr_cuv;
	
	if (!nod -> fii[*p - 'a'])
		return 0;
	
	return query (nod -> fii[*p - 'a'], p + 1);
}

int prefix (trie *nod, char *p, int lg) {
	
	if (*p == '\n' || !nod -> fii[*p - 'a'])
		return lg;
	
	return prefix (nod -> fii[*p - 'a'], p + 1, lg + 1);
}