Mai intai trebuie sa te autentifici.
Cod sursa(job #434190)
Utilizator | Data | 5 aprilie 2010 12:01:56 | |
---|---|---|---|
Problema | Nums | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.8 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, el;
vector <pair <int, 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 == urm)
loc = i;
if (loc == -1)
{
loc = nodTrie->fii.size();
Trie* auxTrie = new Trie;
nodTrie->fii.pb(mp(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] = 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;
}