Pagini recente » Cod sursa (job #2076503) | Cod sursa (job #212731) | Cod sursa (job #2184791) | Cod sursa (job #825549) | Cod sursa (job #573746)
Cod sursa(job #573746)
#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;
}