Cod sursa(job #397201)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 16 februarie 2010 17:18:03
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <string.h>
struct trie{
	int x, nr;
	trie *fiu[26];
	trie (){
		x = nr = 0;
		memset(fiu, 0, sizeof(fiu));
	}
};
char s[50];
trie *T = new trie;
void ins(trie *nod, char *s){
	if(*s == '\n' || *s == '\0'){
		nod->x++;
		return;
	}
	if(nod->fiu[(*s - 'a')] == 0){
		nod->fiu[(*s - 'a')] = new trie;
		nod->nr++;
	}
	ins(nod->fiu[(*s - 'a')], s + 1);
}
int del(trie *nod, char *s){
	if(*s == '\n' || *s == '\0')
		nod->x--;
	else if(del(nod->fiu[*s - 'a'], s + 1)){
		nod->nr--;
		nod->fiu[*s-'a'] = 0;
	}
	if(nod->x == 0 && nod->nr == 0){
		delete(nod);
		return 1;
	}
	return 0;
}
void q1(trie *nod, char *s){
	if(*s == '\n' || *s == '\0' || nod->fiu[*s-'a'] == 0){
		printf("%d\n", nod->x);
		return;
	}
	q1(nod->fiu[*s - 'a'], s + 1);
}
int pre(trie *nod, char *s){
	if(*s == '\n' || nod->fiu[*s-'a'] == 0)
		return 0;
	return 1 + pre(nod->fiu[*s - 'a'], s + 1);
}
int main(){
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	while(!feof(stdin)){
		fgets(s, 50, stdin);
		switch(s[0]){
			case '0' : ins(T, s + 2);break;
			case '1' : del(T, s + 2);break;
			case '2' : q1(T, s + 2);break;
			case '3' : printf("%d\n", pre(T, s + 2));break;
		}
	}
	return 0;
}