Cod sursa(job #329458)

Utilizator katakunaCazacu Alexandru katakuna Data 6 iulie 2009 12:03:33
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;

#define Lmax 100010

int lenmax, j, k, n, i, tip, len, ok, n1, l;
char cuv[Lmax], nr[Lmax];
FILE *g = fopen("nums.out", "w");

struct trie {
	int nr;
	trie *fiu[10];
	
	trie() {
		nr = 0;
		memset(fiu, 0, sizeof(fiu));
	}
};

void add (trie *nod, int i){

	if( i >= lenmax ) { nod->nr++ ; return ;}
	
	if( !nod->fiu[ cuv[i] - '0' ] )
		nod->fiu[ cuv[i] - '0' ] = new trie;
	
	add(nod->fiu[ cuv[i] - '0' ] , i + 1);
	nod->nr++;
	
}

void query (trie *nod, int i){
	
	if(i >= lenmax) { return ;}
	for(j = 0; j <= 9; j++){
		
		if( nod->fiu[j] ){
			if( nod->fiu[j]->nr <  k) 
				k-= nod->fiu[j]->nr;
			
			else{
				if(j) ok = 1;
				if(ok){fprintf(g,"%d", j);}
				query( nod->fiu[j], i + 1);
			}
		}
		
	}

}


int main(){

	FILE *f = fopen("nums.in", "r");
	
	fscanf(f,"%d", &n);
	for(i = 1;  i <= n; i++){
		fscanf(f,"%d ", &tip);
		fscanf(f,"%s", nr);
		if(tip){
			len = strlen(nr);
			if( lenmax < len ) lenmax = len;
		}
	}
	
	fclose(f);
	FILE *ff = fopen("nums.in", "r");
	fscanf(ff,"%d", &n);
	
	trie *R = new trie;
	for(i = 1;  i <= n; i++){
		fscanf(ff,"%d ", &tip);
		ok = 0;
		
		if(tip){
			fscanf(ff,"%s", nr);
			n1 = lenmax - strlen(nr); 
			for(j = 0; j < n1 ; j++)
				cuv[j] = '0';
			
			for( l = 0 ; j <=lenmax; j++, l++)
				cuv[j] = nr[l];
			
			add(R, 0);
		}
		else{
			fscanf(f,"%d", &k);
			query(R, 0);
			fprintf(g,"\n");
		}		
	}
	
	fclose(ff);
	fclose(g);
	
	return 0;
	
}