Cod sursa(job #412878)

Utilizator vlad2179Popescu Vlad Alexandru vlad2179 Data 6 martie 2010 20:27:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<cstdio>
#include<cstring>

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

Trie* T  = new Trie;

void add_word( 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_word( nod->Fiu[ *s - 'a' ] , s+1 );
}

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

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

int Prefix( Trie *nod, char *s, int niv){
	
	if( *s == '\n' || nod->Fiu[ *s - 'a'] ==0 ) return niv;
	return Prefix( nod->Fiu[ *s - 'a'] , s+1, niv +1);
	
}

char Line[25];          

int main(){
	
	FILE *f=fopen("trie.in","r");
	FILE *g=fopen("trie.out","w");
	
	fgets(Line, 25,f );
	
	while ( !feof(f) ){
		
		switch ( Line[0] ){
			
		case '0' : add_word ( T, Line + 2 ); break;
		case '1' : del_word ( T, Line + 2 ); break;
		case '2' : fprintf(g,"%d\n",Query_word(T, Line+2) );break;
		case '3' : fprintf(g,"%d\n",Prefix(T, Line+2,0) );  break;
		
		}
		fgets(Line, 25,f );
	}
	
	 fclose(f);
	 fclose(g);
	 
	return 0;
}