Cod sursa(job #585473)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 29 aprilie 2011 17:25:45
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<stdio.h>
#include<string>

#define maxL 23

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

int s,l,app,L,ch;
char sir[maxL];

struct Trie{
	
	int nr,nrfii; Trie *son[27];
	
	Trie(){
		
		nr = nrfii = 0;
		
		memset(son,0,sizeof(son));
	}
	
	
};

Trie *r = new Trie;

void insert( Trie *nod ){
	
	if ( sir[s] == '\n' ){
		++(nod->nr);
		return ;
	}
	
	ch = sir[s] - 'a' + 1;
	
	if ( nod->son[ ch ] == 0 ){
		
		nod->son[ ch ] = new Trie; 
		(nod->nrfii)++;
		
	}
	
	++s;
	
	insert( nod->son[ ch ] ); 
	
}

bool erase ( Trie *nod , int s ){
	
	if ( sir[s] == '\n' ){
		--nod -> nr;
	}
	else{
		ch = sir[s] - 'a' + 1;
		if ( erase( nod -> son[ ch ] , s + 1 ) ){
			nod -> son[ ch ] = NULL;
			--nod -> nrfii;
		}
	}
	
	if ( !nod -> nrfii && !nod -> nr && nod != r ){
		delete nod;
		return 1;
	}
	
	return 0;
	
}

void appear ( Trie *nod ){
	
	if ( sir[s] == '\n' ){
		app = nod -> nr;
		return ;
	}
	
	ch = sir[s] - 'a' + 1;
	
	if ( nod -> son[ ch ] ){
		++s;
		appear ( nod -> son[ ch ] );
	}
	
}

void sc ( Trie *nod ){
	
	++L;
	
	ch = sir[s] - 'a' + 1;
	
	if ( nod -> son[ ch ] && sir[s] != '\n' ){
		++s;
		sc( nod -> son[ ch ] );
	}
	
}

int main () {
	
	
	
	while ( fgets(sir+1,maxL,f) ){
		
		switch (sir[1]){
			
			case '0' :{
				
				s = 3; insert(r);
				
				break;
			}
			case '1' :{
				
				erase(r,3);
				
				break;
			}
			case '2' :{
				
				s = 3; app = 0; appear(r);
				
				fprintf(g,"%d\n",app );
				
				break;
			}
			case '3' :{
				
				s = 3; L = -1; sc(r); 
				
				fprintf(g,"%d\n",L);
				
				break;
			}
			
		}
		
	}
	
	
	fclose(f);
	fclose(g);
	
	return 0;
}