Pagini recente » Cod sursa (job #1847253) | Cod sursa (job #1599309) | Cod sursa (job #1013637) | Cod sursa (job #542070) | Cod sursa (job #329480)
Cod sursa(job #329480)
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
#define Lmax 100010
int lenmax, j, k, n, i, tip, len, ok, n1, l, ok2;
char cuv[Lmax], nr[Lmax];
FILE *g = fopen("nums.out", "w");
struct trie {
int nr;
char viz;
trie *fiu[10];
trie() {
nr = 0;
viz = 0;
memset(fiu, 0, sizeof(fiu));
}
};
void add (trie *nod, int i){
if( i >= lenmax ) {
if(!nod->viz) {nod->nr++ ; nod->viz = 1; ok2 = 1;}
else ok2 = 0;
return ;
}
if( !nod->fiu[ cuv[i] - '0' ] )
nod->fiu[ cuv[i] - '0' ] = new trie;
add(nod->fiu[ cuv[i] - '0' ] , i + 1);
if(ok2) 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);
break;
}
}
}
}
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;
}