Cod sursa(job #317369)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 23 mai 2009 13:54:00
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <cstdio>
#include <vector>
#include <cassert>
#define LENMAX 100
using namespace std;

struct trie {
 	int St[10], Fiu[10], V[10], Total, Term;       	
};

vector < trie> T;
trie nil;

char k[100100];

int Nr = 1, A[100100];

void insert (int nod, char * x, int level, bool luat) {
//	fprintf(stderr, "NOD : %d Val %c\n", nod, *x);
	
	int lit = *x - '0';

	if (!lit && !luat)
		A[level] = nod;

	if (*x < '0' || *x > '9') {
                if (! T[nod].Term)
			T[nod].Total ++;
		T[nod].Term = 1;
		return;
	}

	if (! T[nod].Fiu[lit]) {
		T[nod].Fiu[lit] = ++ Nr ;
		T.push_back(nil);
	}

	int next = T[nod].Fiu[lit];

	if (lit)
		luat = 1;

	insert (next, x + 1, level + 1, luat);
	                                
	T[nod].V[lit] = T[next].Total;

	T[nod].St[0] = T[nod].V[0];

	for (int i = 1; i <= 9; ++ i) {
		T[nod].St[i] = T[nod].St[i - 1] + T[nod].V[i];
	}

	T[nod].Total = T[nod].St[9] + T[nod].Term;
}

void query (int nod, int k, bool luat) {
	int i;

   //     fprintf(stderr, "I'm in node %d searching for %d-th\n", nod, k);
	if (T[nod].Term) {
		if (k == 1)
			return ;
		else
			k --;
	}

	for (i = 0; i <= 9 && T[nod].St[i] < k; ++ i);

	while (i >= 0 && T[nod].Fiu[i] == 0)
		-- i;

	assert (i <= 9);
	assert (i >= 0);

	int next = k;

	if (i > 0)
		next -= T[nod].St[i - 1];
 	if (i || (!i && luat))
		printf("%d", i);
	if (i)
		luat = 1;
	query (T[nod].Fiu[i], next, luat);
}

void make (char k[]) {
 	int x = strlen(k);

	if (x < LENMAX + 1) {
		int diff = LENMAX - x + 1;
         	for (int i = LENMAX; i >= 1; -- i)
			k[i + diff] = k[i];
		for (int i = 1; i <= diff; ++ i)
			k[i] = '0';
	}
  //      puts(k);
}
int main () {
 	int N, i, tip, x;

	freopen("nums.in", "r", stdin);
	freopen("nums.out", "w", stdout);

	scanf("%d", &N);

	T.push_back(nil); T.push_back(nil);

	for (i = 1; i <= N; ++ i) {
		scanf("%d", &tip);
                
		if (tip == 1) {
		        gets(k);
			make(k);
			insert (1, k + 1, 0, false);
		}
		else {
			scanf("%d", &x);
        		query (1, x, false);
        		printf("\n");
		}
	}

   /*     for (int j = 1; j <= Nr; ++ j) {	
		printf("***************************\n");
		printf("NOD : %d\n", j);
		printf("%d\n", T[j].Total);
		printf("%d\n", T[j].Term);
        	
		for (i = 0; i < 10; ++ i)
			printf("%d ", T[j].St[i]);
	
		puts("");
	
		for (i = 0; i < 10; ++ i)
			printf("%d ", T[j].Fiu[i]);

		puts("");

		for (i = 0; i < 10; ++ i)
			printf("%d ", T[j].V[i]);
		puts("");
	}*/
}