Pagini recente » Cod sursa (job #891713) | Cod sursa (job #18509) | Cod sursa (job #2276682) | Cod sursa (job #2252159) | Cod sursa (job #317770)
Cod sursa(job #317770)
#include<cstdio>
#include<cstring>
using namespace std;
#define INPUT "nums.in"
#define OUTPUT "nums.out"
#define SET(X) memset(X, 0, sizeof(X))
const long NMAX = 100001;
FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");
typedef struct Tr
{
int nrChild;
long curent, total;
Tr* Child[ 10 ];
Tr()
{
nrChild = curent = total = 0;
SET(Child);
}
};
char Sir[ NMAX ], Sir2[ NMAX ];
long maxDp;
Tr *Trie = new Tr;
int addTr(Tr* T, char *S)
{
if(*S == '\n' || *S == '\0')
{
if(T -> curent == 0)
{
T -> curent = 1, T -> total = 1, T -> nrChild = 0;
return 1;
}
return 0;
}
else
{
if(T -> Child[ *S - '0' ] == NULL)
{
T -> Child[ *S - '0' ] = new Tr;
T -> nrChild ++;
}
if(addTr(T -> Child[ *S - '0' ], S+1))
{
T -> total ++;
return 1;
}
}
return 0;
}
void searchTr(Tr* T, long P, int Start)
{
long totalCur = 0;
for(int i = 0; i <= 9; ++i)
{
if(T -> Child[ i ] != NULL)
{
totalCur += (T -> Child[ i ] -> total);
if(totalCur >= P)
{
totalCur -= (T -> Child[ i ] -> total);
if(!i && Start)
searchTr(T -> Child[ i ], P-totalCur, 1);
else
{
fprintf(fout, "%c", i+'0');
searchTr(T -> Child[ i ], P-totalCur, 0);
}
break;
}
}
}
}
int main()
{
long N, Poz, len, V;
int Code;
Tr *T, *T2;
fscanf(fin, "%ld", &N);
maxDp = 0;
for(;N--;)
{
SET(Sir);
fscanf(fin, "%d", &Code);
if(Code)
{
fscanf(fin, "%s", &Sir);
len = strlen(Sir);
if(maxDp == 0) maxDp = len;
if(maxDp < len)
{
V = Trie -> total;
T = new Tr;
T -> total = V;
T2 = T;
for(long i = 1; i < len-maxDp; ++i)
{
T -> Child[ 0 ] = new Tr;
T = T -> Child[ 0 ];
T -> total = V;
}
T -> Child[ 0 ] = Trie;
Trie = T2;
maxDp = len;
}
for(long i = 0; i < maxDp; ++i)
if(i >= maxDp - len) Sir2[ i ] = Sir[ i - maxDp + len ];
else Sir2[ i ] = '0';
addTr(Trie, Sir2);
}
else
{
fscanf(fin, "%ld", &Poz);
searchTr(Trie, Poz, 1);
fprintf(fout, "\n");
}
}
fclose(fin);
fclose(fout);
return 0;
}