Cod sursa(job #459841)

Utilizator vladiiIonescu Vlad vladii Data 31 mai 2010 13:31:06
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <iostream>
using namespace std;
#define maxn 100010

int N, maxdim;
char A[maxn], B[maxn];

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

Trie *T = new Trie;

int find(Trie *q, int poz) {
	if(poz == maxdim) return 1;
	
	int next = B[poz] - '0';
	if(q->fiu[next]) return find(q->fiu[next], poz+1);
	else return 0;
}

void insert(Trie *q, int poz) {
	q->value++;
	if(poz == maxdim) return;
	
	int next = B[poz] - '0';
	if(!q->fiu[next]) {
		 q->fiu[next] = new Trie;
	}
	
	insert(q->fiu[next], poz+1);
}

void query(Trie *q, int poz, int k) {
	int nw = 0, lst = 0;
	for(int i=0; i<=9; i++) {
         if(q->fiu[i]) {
		      lst = nw;
		      nw += q->fiu[i]->value;
		      if(k <= nw) {
			       B[poz] = char('0' + i);
			       if(poz == maxdim-1) return;
			       else query(q->fiu[i], poz+1, k-lst);
			       return;
		      }
         }	
	}	
}

int main() {
    FILE *f1=fopen("nums.in", "r"), *f2=fopen("nums.out", "w");
	int i, j, t, k, len, ok;
	fscanf(f1, "%d\n", &N);
	for(i=1; i<=N; i++) {
		 fscanf(f1, "%d ", &t);
		 fgets(A, sizeof(A), f1);
		 len = strlen(A) - 1;
		 if(t == 1) maxdim = max(maxdim, len);
	}
	fclose(f1);
	
	FILE *f3=fopen("nums.in", "r");
	fscanf(f3, "%d\n", &N);
	
	for(i=1; i<=N; i++) {
		 fscanf(f3, "%d ", &t);
		 if(t == 1) {
              fgets(A, sizeof(A), f3);
		      len = strlen(A) - 1;
		      for(j=0; j<maxdim - len; j++) {
		           B[j] = '0';
              }
		      for(j=0; j<len; j++) {
		           B[maxdim - len + j] = A[j];
              }
			  ok = find(T, 0);
			  if(!ok) insert(T, 0);
		 }	
		 else {
              fscanf(f1, "%d", &k);
			  query(T, 0, k);
			  j=0;
			  while(B[j] == '0') j++;
			  for(; j<maxdim; j++) {
				   fprintf(f2, "%c", B[j]);
              }
			  fprintf(f2, "\n");	
		 }	
	}	
	
	fclose(f3); fclose(f2);
	return 0;
}