Cod sursa(job #359324)

Utilizator marinMari n marin Data 26 octombrie 2009 17:22:38
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
#include <string.h>
struct trie {
	int nr,nf;
	trie *V[26];

	trie(){
		for (int i=0;i<=25;i++)
			V[i] = NULL;
		nr = nf = 0;
	}
};

char S[100];
trie *t;
int i, o, k;
trie *p;

int del(trie *p, int i){
	if( i == strlen(S) )
		p->nr--;
	else
		if( del( p-> V[S[i]-'a'], i+1 )){
			p-> V[S[i]-'a'] =0;
			p-> nf --;
		}
	if( p->nr == 0 && p->nf == 0 && p!=t){
		delete p; return 1;
	}
	return 0;
}

int main(){
	FILE *f = fopen("trie.in", "r");
	FILE *g = fopen("trie.out", "w");
	
	t = new trie;
	
	while (1) {
		k++;
		if (fscanf(f,"%d %s",&o, S)!=2)
			break;
		if (o == 0) {
			p = t;
			for (i=0; i<strlen(S); i++) {
				if (p->V[S[i]-'a'] == NULL) {
					p->V[S[i]-'a'] = new trie;
					p->nf ++;
				}
				p = p->V[S[i]-'a'];
			}
			p->nr ++;
		} else if (o == 2) {
			for (p = t, i = 0; p->V[S[i]-'a'] != NULL && i<strlen(S); p = p->V[S[i]-'a'], i++);
			if (p == NULL) {
				fprintf(g,"%d\n",0);
			} else {
				fprintf(g,"%d\n",p->nr);
			}
				
		} else if (o == 3){
			for (p = t, i = 0; p->V[S[i]-'a'] != NULL && i<strlen(S); p = p->V[S[i]-'a'], i++) ;
			fprintf(g,"%d\n",i);
		} else {
			del(t,0);
		}
	}
	
	fclose(g);
	fclose(f);
	delete t;
//	printf("%d",k);
	return 0;
}