#include <stdio.h>
#include <string.h>
char num[4001];
int suffix[4001];
int mark[4001];
int comparel(char* a, char*b)
{
int i;
for(i = 0; a[i] !=0 && b[i] != 0; i++)
{
if(a[i] != b[i] )
return i;
}
return i;
}
int compare(char *a, char* b)
{
int i;
for(i = 0; a[i] != 0 && b[i] != 0; i++)
{
if(a[i] > b[i] )
return 1;
else if(a[i] == b[i])
continue;
else
return -1;
}
if(a[i] == 0 && b[i] != 0)
return 1;
else if(a[i] != 0 && b[i] == 0)
return -1;
return 0;
}
void removel(int len)
{
int i, j,tmp;
for(i = 0,j = i+1; j < len; i++,j++)
{
tmp = comparel(num+ (len-suffix[i]), num+ (len-suffix[j]));
if(tmp==0)
continue;
else
mark[j] += tmp;
}
}
void getparse(int len)
{
int i, j,tmp;
for(i = 0; i < len; i++)
{
for(j = i+1; j < len; j++)
{
if (compare(num+ (len-suffix[i]), num+ (len - suffix[j])) > 0)
{
tmp = suffix[i];
suffix[i] = suffix[j];
suffix[j] = tmp;
}
}
}
}
int main(void)
{
int T, test_case;
int len, i,j,K;
setbuf(stdout, NULL);
scanf("%d", &T);
for(test_case = 0; test_case < T; test_case++)
{
scanf("%d", &K);
scanf("%s", num);
memset(mark, 0, sizeof(mark));
len = strlen(num);
for(i = 0; i < len; i ++)
{
suffix[i] = len - i;
}
getparse(len);
removel(len);
for(i = 0; i < len; i++)
{
if(K > suffix[i]-mark[i])
K -= suffix[i]-mark[i];
else
{
printf("Case #%d\n", test_case+1);
for(j = (len-suffix[i]); j < len-suffix[i]+mark[i]+K; j++)
{
printf("%c", num[j]);
if(j == len-suffix[i]+mark[i]+K-1)
printf("\n");
}
K -= suffix[i]-mark[i];
break;
}
}
if(K > 0)
{
printf("Case #%d\n", test_case+1);
printf("%s\n", "none");
}
}
return 0;//Your program should return 0 on normal termination.
}
suffix array
最新推荐文章于 2022-07-16 20:55:52 发布