Pagini recente » Cod sursa (job #3195588) | Cod sursa (job #2779379) | Cod sursa (job #2936330) | Cod sursa (job #2664329) | Cod sursa (job #574934)
Cod sursa(job #574934)
#include <cstdio>
#include <string.h>
#define CH (s[0]-'0')
FILE *f,*g;
char st[100100];
bool okk;
int sum,i,n,j,sol;
struct Trie {
int val;
Trie *fiu[10];
Trie () {
memset(fiu, 0, sizeof(fiu));
val=0;
}
};
Trie *T = new Trie ;
Trie *v[100100];
void ins(Trie *nod, char *s) {
if (*s=='\n') {
if (nod->val==1)
okk=false;
nod -> val=1;
return ;
}
if (nod -> fiu[ CH ] == 0) {
nod -> fiu[ CH ] = new Trie;
}
ins(nod -> fiu[CH],s+1);
if (okk==true)
nod -> val++;
}
void caut(Trie *nod, int k,bool ok) {
for (sum=0,j=ok==true?1:0;j<=9;j++) {
if (nod->fiu[j]!=0) {
if (sum+nod->fiu[j]->val>=k)
break;
sum+=nod->fiu[j]->val;
}
}
if (j==10) return ;
fprintf(g,"%d",j);
caut(nod->fiu[j],k-sum,false);
}
int main() {
f=fopen("nums.in","r");
g=fopen("nums.out","w");
int x,y;
fscanf(f,"%d",&n);
fgets(st,1000,f);
for (i=2,v[1]=T;i<=100000;i++) {
v[i] = new Trie;
}
Trie ax;
for (i=1;i<=n;i++) {
fgets(st,100010,f);
for (j=2;j<strlen(st) && st[j]>='0' && st[j]<='9';j++);
st[j]='\n';
st[j+1]='\0';
switch (*st) {
case '1' : {
okk=true;
ins(v[100001-(strlen(st)-3)],st+2);
break;
}
case '0' : {
for (j=2,x=0;j<strlen(st)-1;j++)
x=x*10+(st[j]-'0');
j = 100000;
y = 0;
while (y + (v[j]->val)< x ) {
y+=v[j--]->val;
}
caut(v[j],x-y,true);
fprintf(g,"\n");
break;
}
}
}
fclose(g);
return 0;
}