Cod sursa(job #434198)

Utilizator ProtomanAndrei Purice Protoman Data 5 aprilie 2010 12:25:20
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>

#define MAX 100010
#define pb push_back
#define mp make_pair
#define f first
#define s second

using namespace std;

class Trie
{
public:
	int nr;
	short el;
	vector <pair <char, Trie*> > fii;

	Trie()
	{
		this->nr = 0, this->el = 0;
	}
};
Trie *rad[MAX], *sum[10];
int n;
char strCit[MAX];
string strAf;

inline int addTrie(Trie *nodTrie, char s[])
{
	if (s[0] == '\n')
	{
		if (nodTrie->nr)
			return 0;

		nodTrie->nr = nodTrie->el = 1;

		return 1;
	}
	else
	{
		int urm = s[0] - '0', loc = -1;
		for (int i = 0; i < nodTrie->fii.size(); i++)
			if (nodTrie->fii[i].f == '0' + urm)
				loc = i;

		if (loc == -1)
		{
			loc = nodTrie->fii.size();
			Trie* auxTrie = new Trie;

			nodTrie->fii.pb(mp('0' + urm, auxTrie));
		}

		int ad = addTrie(nodTrie->fii[loc].s, s + 1);
		nodTrie->nr += ad;

		return ad;
	}
}

inline void queryTrie(Trie *nodTrie, int nr)
{
	nr -= nodTrie->el;
	if (!nr)
		return;

	memset(sum, 0, sizeof(sum));
	for (int i = 0; i < nodTrie->fii.size(); i++)
		sum[nodTrie->fii[i].f - '0'] = nodTrie->fii[i].s;

	int i;
	for (i = 0; ; i++)
		if (sum[i])
		{
			if (nr > sum[i]->nr)
				nr -= sum[i]->nr;
			else break;
		}

	strAf += char('0' + i);
	queryTrie(sum[i], nr);
}

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

	for (int i = 1; i < MAX; i++)
		rad[i] = new Trie;

	for (scanf("%d\n", &n); n; n--)
	{
		int caz;
		scanf("%d ", &caz);

		if (caz)
		{
			fgets(strCit, MAX, stdin);
			int l = strlen(strCit) - 1;

			addTrie(rad[l], strCit);
		}
		else
		{
			int nr, i;
			scanf("%d\n", &nr);

			for (i = 1; ; i++)
				if (nr > rad[i]->nr)
					nr -= rad[i]->nr;
				else break;

			strAf.clear();
			queryTrie(rad[i], nr);

			cout << strAf << '\n';
		}
	}

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