Cod sursa(job #580354)

Utilizator aloneForever Alone alone Data 12 aprilie 2011 23:17:48
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <cstring>

#define nxt (nod -> fii[*p - 'a'])

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;

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

int main () {
	
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	
	R = new trie ();
	
	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", aparitii (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 (!nxt) {
		nxt = new trie ();
		nod -> nr_fii++;
	}
	
	adauga (nxt, p + 1);
}

int aparitii (trie *nod, char *p) {
	
	if (*p == '\n') return nod -> nr_cuv;
	
	if (!nxt) return 0;
	
	return aparitii (nxt, p + 1);
}

bool 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 (!nxt) return 0;
	
	if (sterge (nxt, p + 1)) {
		nod -> nr_fii--;
		nxt = 0;
		
		if (nod != R && !nod -> nr_cuv && !nod -> nr_fii) {
			delete nod; return 1;
		}
		else return 0;
	}
	
	return 0;
}

int prefix (trie *nod, char *p, int lg) {
	
	if (*p == '\n' || !nxt) return lg;
	
	return prefix (nxt, p + 1, lg + 1);
}