Cod sursa(job #311702)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 3 mai 2009 22:52:05
Problema Nums Scor Ascuns
Compilator cpp Status done
Runda Marime 1.72 kb
#include <algorithm>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>

#define MAX 100010

using namespace std;

class Trie
{
	public:
		int sfin, sub;
		Trie* fii[10];

		Trie()
		{
			this->sfin = 0, this->sub = 0;
			memset(fii, 0, sizeof(fii));
		}
};
Trie* radTrie[MAX];
string strFin;
char strQ[MAX];
int k;

inline int insertTrie(Trie *nodTrie, char s[])
{
	if (s[0] == '\n')
	{
		if (nodTrie->sfin)
			return 0;
		nodTrie->sfin = 1;
		nodTrie->sub++;

		return 1;
	}
	else
	{
		int suc = s[0] - '0';
		if (!nodTrie->fii[suc])
			nodTrie->fii[suc] = new Trie;
		int ad = insertTrie(nodTrie->fii[suc], s + 1);
		nodTrie->sub += ad;

		return ad;
	}
}

inline void scoateTrie(Trie *nodTrie, int ind)
{
	ind -= nodTrie->sfin;
	if (!ind)
		return;

	int i = 0;
	for (; i < 10; i++)
		if (nodTrie->fii[i])
		{
			int r = nodTrie->fii[i]->sub;

			if (ind > r)
				ind -= r;
			else break;
		}

	strFin += (char) i + '0';
	scoateTrie(nodTrie->fii[i], ind);
}

int main()
{
	for (int i = 1; i <= 100000; i++)
		radTrie[i] = new Trie;

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

	for (scanf("%d\n", &k); k; k--)
	{
		fgets(strQ, MAX, stdin);

		if (strQ[0] == '1')
			insertTrie(radTrie[strlen(strQ) - 3], strQ + 2);
		else
		{
			int nr = 0;
			for (int i = 2, lung = strlen(strQ) - 1; i < lung; i++)
				nr = nr * 10 + strQ[i] - '0';
			strFin.clear();
			int i = 1;
			for (; i <= 100000; i++)
				if (!(nr > radTrie[i]->sub))
					break;
				else nr -= radTrie[i]->sub;
			scoateTrie(radTrie[i], nr);
			
			cout << strFin;
			printf("\n");
		}
	}

	fclose(stdin);
	fclose(stdout);
	return 0;
}