Cod sursa(job #1001154)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 24 septembrie 2013 16:33:42
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<fstream>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

int op;
char cuv[310];

struct trie{
	int nc , nf;
	trie *f[26];
	
	trie(){
		nc = nf = 0;
		for(int i = 0 ; i <= 25 ; i++)
			f[i] = 0;
	}
}*r , *R;

void add( trie *r , char *a ){
	
	if( (*a) == '\0' ){
		r->nc++;
		return;
	}
	
	int ch = (*a) - 'a';
	
	if( r->f[ch] == 0 ){
		r->f[ch] = new trie;
		r->nf++;
	}
	
	add( r->f[ch] , a+1 );
	
}

int sterge( trie *r , char *a){
	
	if( (*a) == '\0' ){
		r->nc--;
		if( r->nc == 0 && r->nf == 0 && R != r ){
			delete r;
			return 1;
		}
	}
	
	int ch = (*a) - 'a';
	
	int ok = sterge( r->f[ch] , a+1 );
	
	if(ok){
		r->nf--;	r->f[ch] = 0;
	}
	
	if( r->nf == 0 && r->nc == 0 && r != R ){
		delete r;
		return 1;
	}
	
	return 0;
}

int print( trie* r , char *a ){
	
	if( (*a) == '\0' )
		return r->nc;
	
	int ch = (*a) - 'a';
	
	if( r->f[ch] == 0 )
		return 0;
	return print(r->f[ch] , a+1);
	
}

int search( trie *r , char *a , int niv ){
	
	if( (*a) == '\0' )
		return niv;
	
	int ch = (*a) - 'a';
	
	if( r->f[ch] == 0 )
		return niv;
	return search(r->f[ch] , a+1 , niv+1);
	
	
}

int main(){
	
	r = new trie; R = r;
	
	while( !f.eof() ){
		f>>op;	f>>cuv;
		
		switch( op ){
		case 0:
			add(r , cuv);
			break;
		case 1:
			sterge(r , cuv);
			break;
			
		case 2:
			g<<print(r , cuv)<<"\n";
			break;
			
		case 3:
			g<<search(r , cuv , 0)<<"\n";
			break;
		}
		
	}
	
	
	return 0;
}