Cod sursa(job #270707)

Utilizator BaduBadu Badu Badu Data 4 martie 2009 13:57:50
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<stdio.h>
#include<string.h>

FILE *f = fopen("trie.in","r");
FILE *g = fopen("trie.out","w");

struct trie {

	int nr;
	int fii;

	trie *next[26];

	trie(){
		nr=0;
		fii=0;
		memset(next,0,sizeof(next));
	}

};

trie *R = new trie;

void Insert(trie *nod,char *p){

	if( *p == '\n') { nod->nr++; return; }

	if(!nod->next[*p - 'a']){
		nod->next[*p - 'a'] = new trie;
		nod->fii++;
	}

	Insert(nod->next[*p - 'a'],p+1);

}

int Delete(trie *nod, char *p){

	if(*p == '\n') nod->nr--;

	else if( Delete(nod->next[*p - 'a'], p+1) ) {
		nod->next[*p - 'a'] = 0;
		nod->fii--;
	}

	if(nod->nr == 0 && nod->fii == 0 && nod != R){

		delete nod; return 1;

	}

	return 0;
}

int Prefix(trie *nod , char *p,int dim){

	if( *p == '\n' || nod->next[ *p - 'a' ] == 0) return dim;
	return Prefix(nod->next[ *p - 'a' ],p+1,dim+1);


}

int Query(trie *nod, char *p){

	if ( *p == '\n' ) return nod->nr;

	if(nod->next[ *p - 'a' ]) return Query(nod->next[ *p - 'a' ],p + 1);

	return 0;

}


int main(){

	char buff[35];

	while(!feof(f)) {

		fgets(buff,35,f);

		switch (buff[0]) {

			case '0': Insert(R,buff+2);                    break;
			case '1': Delete(R,buff+2);                    break;
			case '2': fprintf(g,"%d\n",Query(R,buff+2) );  break;
			case '3': fprintf(g,"%d\n",Prefix(R,buff+2,0));break;

		}


	}

return 0;

}