Problem:
Score : 300 points

Problem Statement

You are given a string s.
Among the different substrings of s, print the K-th lexicographically smallest one.

A substring of s is a string obtained by taking out a non-empty contiguous part in s.
For example, if s = ababc, a, bab and ababc are substrings of s, while ac, z and an empty string are not.
Also, we say that substrings are different when they are different as strings.

Let X = x_{1}x_{2}...x_{n} and Y = y_{1}y_{2}...y_{m} be two distinct strings. X is lexicographically larger than Y if and only if Y is a prefix of X or x_{j} > y_{j} where j is the smallest integer such that x_{j} \neq y_{j}.

Constraints

1 ≤ |s| ≤ 5000

s consists of lowercase English letters.

1 ≤ K ≤ 5

s has at least K different substrings.

Partial Score

200 points will be awarded as a partial score for passing the test set satisfying |s| ≤ 50.

Input

Input is given from Standard Input in the following format:

s
K

Output

Print the K-th lexicographically smallest substring of K.

Sample Input 1

aba
4

Sample Output 1

b

s has five substrings: a, b, ab, ba and aba.
Among them, we should print the fourth smallest one, b.
Note that we do not count a twice.

Sample Input 2

atcoderandatcodeer
5

Sample Output 2

andat

Sample Input 3

z
1

Sample Output 3

z

Solution in C (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#define llong long long
#define fr(i,l,r) for(i=(l);i<(r);i++)
#define min(p,q) ((p)<(q)?(p):(q))
#define max(p,q) ((p)>(q)?(p):(q))
#define INF 1000000000000//10^12

int main(void)
{
	//変数の宣言
	char s[5010];
	char anschar[10];
	int sint[5010];
	int n,m;
	static int map1[30];
	static int map2[30][30];
	static int map3[30][30][30];
	static int map4[30][30][30][30];
	static int map5[30][30][30][30][30];
	
	//よく使う変数
	int i,j,k,l,p;
	int flag=0;
	llong int ans=0;
	int count=0;
	int temp,temp1,temp2;
	llong int max,min;
	int len;
	int sum=0;
	//データの読み込み
	scanf("%s",&s);
	scanf("%d",&m);
	
	
	
//	printf("nは%dです\n", n);
//	printf("データの読み込み終了\n");
	//実際の処理
	n=strlen(s);
	
	for(i=0;i<n;i++){
		sint[i]=s[i]-'a';
	}
	for(i=0;i<n;i++){
		map1[sint[i]]++;
		if(i<n-1)map2[sint[i]][sint[i+1]]++;
		if(i<n-2)map3[sint[i]][sint[i+1]][sint[i+2]]++;
		if(i<n-3)map4[sint[i]][sint[i+1]][sint[i+2]][sint[i+3]]++;
		if(i<n-4)map5[sint[i]][sint[i+1]][sint[i+2]][sint[i+3]][sint[i+4]]++;
	}
	
	for(i=0;i<26;i++){
		if(map1[i]>0){
			count++;
			if(count==m){
				printf("%c",i+'a');
			}
		}
		for(j=0;j<26;j++){
			if(map2[i][j]>0){
				count++;
				if(count==m){
					printf("%c%c",i+'a',j+'a');
				}
			}
			for(k=0;k<26;k++){
				if(map3[i][j][k]>0){
					count++;
					if(count==m){
						printf("%c%c%c",i+'a',j+'a',k+'a');
					}
				}
				for(l=0;l<26;l++){
					if(map4[i][j][k][l]>0){
						count++;
						if(count==m){
							printf("%c%c%c%c",i+'a',j+'a',k+'a',l+'a');
						}
					}
					for(p=0;p<26;p++){
						if(map5[i][j][k][l][p]>0){
							count++;
							if(count==m){
								printf("%c%c%c%c%c",i+'a',j+'a',k+'a',l+'a',p+'a');
							}
						}
					}
				}
			}
		}
	}
	
//	printf("計算部分終了\n");
	//出力
	
	//printf("%lld",ans);
	
//	printf("結果の出力終了\n");
	
	return 0;
	
}