Cod sursa(job #573746)

Utilizator crushackPopescu Silviu crushack Data 6 aprilie 2011 15:46:28
Problema Nums Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#include <string.h>
#define LMax 100010

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

int N,K,L;
char s[LMax];

struct nod{
	int nrElem;
	nod *next[10];
	nod()
	{
		nrElem=0;
		memset(next,0,sizeof(next));
	}
} *trie=new nod, *ad[LMax];

void add(char *s)
{
	nod* node;
	int len=strlen(s);
	while (len>L)
		++L,
		node=new nod,
		node->next[0]=trie,
		trie=node,
		ad[L]=trie;
	node= ad[len];
	++node->nrElem;
	while (*s!='\0')
	{
		if (!node->next[*s-'0'])
			node->next[*s-'0']=new nod;
		node=node->next[*s-'0'];
		++node->nrElem;
		++s;
	}
}

bool Query(char *s)
{
	int len=strlen(s);
	if (len>L) return false;
	nod *node=ad[len];
	while (*s!='\0' && node->next[*s-'0'])
	{
		node=node->next[*s-'0'];
		++s;
	}
	return *s=='\0';
}

void Query(int K)
{
	int i,j,sum=0,first=1;
	for (i=0;i<L && K>ad[i]->nrElem;++i)
		K-=ad[i]->nrElem;
	nod* node=ad[i];j=i;
	while (node && j--)
	{
		for (i=first;i<10;++i)
			if (node->next[i] && K>node->next[i]->nrElem)
				K-=node->next[i]->nrElem;
			else if (node->next[i])
				break;
		printf("%d",i);
		node=node->next[i];
		first=0;
	}
	printf("\n");
}

int main()
{
	int i,c;
	freopen(IN,"r",stdin);
	scanf("%d",&N);
	ad[0]=trie;
	freopen(OUT,"w",stdout);
	for (i=0;i<N;++i)
	{
		scanf("%d",&c);
		switch(c)
		{
			case 1:
				scanf("%s",s);
				if (!Query(s))
					add(s);
			break;
			case 0:
				scanf("%d",&K);
				Query(K);
			break;
		}
	}
	fclose(stdout);
	fclose(stdin);
	return 0;
}