Cod sursa(job #475283)

Utilizator Addy.Adrian Draghici Addy. Data 6 august 2010 14:19:24
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <cstring>

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

char line[32];
Trie *R = new Trie;

void add (Trie*, char*);
int del (Trie*, char*);
int query (Trie*, char*);
int prefix (Trie*, char*, int);

int main () {
	
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	
	fgets (line, 32, stdin);
	while (!feof (stdin)) {
		switch (line[0]) {
			case '0': add (R, line + 2); break;
			case '1': del (R, line + 2); break;
			case '2': printf ("%d\n", query (R, line + 2)); break;
			case '3': printf ("%d\n", prefix (R, line + 2, 0)); break;
		}
		
		fgets (line, 32, stdin);
	}
	
	return 0;
}

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

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

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

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