Cod sursa(job #574934)

Utilizator costyv87Vlad Costin costyv87 Data 7 aprilie 2011 18:26:47
Problema Nums Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#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;
}