Cod sursa(job #379509)

Utilizator katakunaCazacu Alexandru katakuna Data 2 ianuarie 2010 00:00:07
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;

#define Nmax 20

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

Trie *R = new Trie;
int tip;
char s[Nmax];

void add (Trie *nod, char *s) {
	
	if (*s == '\n') { nod->nr_cuv++; return ; }
	if (!nod->fiu[*s - 'a']) { 
		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--;
		if (nod != R && !nod->nr_cuv && !nod->nr_fii) {
			delete nod;
			return 1;
		}
		
		else
			return 0;
	}
	
	if (!nod->fiu[*s - 'a'])
		return 0;
	
	if ( del (nod->fiu[*s - 'a'], s+1) ) {
		nod->nr_fii--; 
		nod->fiu[*s - '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 *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')
		return lg;
	
	if (!nod->fiu[*s - 'a'])
		return lg;
	
	return prefix (nod->fiu[*s - 'a'], s + 1, lg + 1);
}

int main () {

	FILE *f = fopen ("trie.in", "r");
	FILE *g = fopen ("trie.out", "w");
	
	fscanf (f, "%d %s", &tip, s); s[strlen(s)] = '\n';
	while (!feof (f)) {
		switch (tip) {
			case 0 : add (R, s); break;
			case 1 : del (R, s); break;
			case 2 : fprintf (g, "%d\n", query (R, s)); break;
			case 3 : fprintf (g, "%d\n", prefix (R, s, 0)); break;
		}
		
		memset (s, 0, sizeof (0)); 
		fscanf (f, "%d %s", &tip, s); s[strlen(s)] = '\n';
	}
	
	fclose (f);
	fclose (g);
	
	return 0;
}