Cod sursa(job #522321)

Utilizator crushackPopescu Silviu crushack Data 14 ianuarie 2011 20:38:31
Problema Nums Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <string.h>
#define NMax 100005
using namespace std;

const char IN[]="nums.in",OUT[]="nums.out";

int N;
char s[NMax];

ifstream fin(IN);
ofstream fout(OUT);

struct nod{
	int x;
	nod *p[10];
	nod()
	{
		x=0;
		memset(p,0,sizeof(p));
	}
};

int LMax=0;
nod *root=0;
nod *p[NMax];

void insert(char *s)
{
	int i,L=strlen(s),ct=0;
	nod *node;
	while (LMax<L)
	{
		node=root;
		root=NULL;
		root=new nod;
		root->p[0]=node;
		if (node)
			root->x=node->x;
		++LMax;
		p[LMax]=root;
	}
	node=p[L];
	for (i=0;i<L && node;++i)
	{
		if (!node->p[ s[i] - '0'])
			node->p[ s[i]- '0' ]=new nod,++ct;
		node= node->p[ s[i] - '0'];
	}
	node=root;
	if (ct && node)
	{
		++node->x;
		for (i=0;i<LMax-L;++i)
		{
			node= node->p[0];
			++node->x;
		}
		for (i=0;i<L && node;++i)
		{
			node= node->p[ s[i] - '0'];
			++node->x;
		}
	}
}

void Query(int k)
{
	int i,j,lj=0,L,kp=k;
	for (i=1;i<=LMax && kp-p[i]->x>0;++i);
	nod *node= p[i];
	L=i;
	
	for (i=0;i<L && node;++i)
	{
		for (j=0;j<10;++j)
			if (node->p[j] && k- node->p[j]->x>0)
				k-=node->p[j]->x,lj=j;
			else if (node->p[j])
				break;
		if (j==10) j=lj;
		fout<<j;
		node= node->p[j];
	}
	
	fout<<"\n";
}

int main()
{
	int i,c,k;
	fin>>N;
	for (i=0;i<N;++i)
	{
		fin>>c;
		switch(c)
		{
			case 1:
				fin>>s;
				insert(s);
			break;
			case 0:
				fin>>k;
				Query(k);
			break;
		}
	}
	
	return 0;
}