Problem:
Score : 2300 points

Problem Statement

You are given a set S of strings consisting of 0 and 1, and an integer K.

Find the longest string that is a subsequence of K or more different strings in S.
If there are multiple strings that satisfy this condition, find the lexicographically smallest such string.

Here, S is given in the format below:

The data directly given to you is an integer N, and N+1 strings X_0,X_1,...,X_N. For every i (0\leq i\leq N), the length of X_i is 2^i.

For every pair of two integers (i,j) (0\leq i\leq N,0\leq j\leq 2^i-1), the j-th character of X_i is 1 if and only if the binary representation of j with i digits (possibly with leading zeros) belongs to S. Here, the first and last characters in X_i are called the 0-th and (2^i-1)-th characters, respectively.

S does not contain a string with length N+1 or more.

Here, a string A is a subsequence of another string B when there exists a sequence of integers t_1 < ... < t_{|A|} such that, for every i (1\leq i\leq |A|), the i-th character of A and the t_i-th character of B is equal.

Constraints

0 \leq N \leq 20

X_i(0\leq i\leq N) is a string of length 2^i consisting of 0 and 1.

1 \leq K \leq |S|

K is an integer.

Input

Input is given from Standard Input in the following format:

N K
X_0
:
X_N

Output

Print the lexicographically smallest string among the longest strings that are subsequences of K or more different strings in S.

Sample Input 1

3 4
1
01
1011
01001110

Sample Output 1

10

The following strings belong to S: the empty string, 1, 00, 10, 11, 001, 100, 101 and 110.
The lexicographically smallest string among the longest strings that are subsequences of four or more of them is 10.

Sample Input 2

4 6
1
01
1011
10111010
1101110011111101

Sample Output 2

100

Sample Input 3

2 5
0
11
1111

Sample Output 3

The answer is the empty string.

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static final int MAX = 22;
	static int N, K;
	
	static int[][] next;
	
	static int calcNext(int n, int dig) {
		for (int i = MAX; i >= 0; i--) {
			if ((n & (1 << i)) != 0) {
				for (int j = i - 1; j >= 0; j--) {
					if (((n & (1 << j))) == 0 == (dig == 0)) {
						return n & ((1 << j) - 1) | (1 << j);
					}
				}
			}
		}
		return 0;
	}
	
	static char[] current;
	static char[] best;
	static int[][] count;
	
	static void bt(int pos) {
		if (pos > best.length) {
			best = Arrays.copyOf(current, pos);
		} else if (pos == best.length) {
			boolean copy = false;
			for (int i = 0; i < best.length; i++) {
				if (best[i] < current[i] && !copy) break;
				else if (copy || best[i] > current[i]) {
					copy = true;
					best[i] = current[i];
				}
			}
		}
		for (int j = 0; j < 2; j++) {
			int total = 0;
			for (int i = 1; i < count[pos].length; i++) {
				int vec = next[i][j];
				count[pos + 1][vec] += count[pos][i];
				if (vec > 0) total += count[pos][i];
			}
			if (total >= K) {
				current[pos] = (char)('0'+ j);
				bt(pos+1);
			}
			for (int i = 1; i < count[pos].length; i++) {
				count[pos + 1][next[i][j]] -= count[pos][i];
			}
		}
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
		N = sc.nextInt();
		K = sc.nextInt();
		next = new int[1 << (N + 1)][2];
		for (int i = 1; i < next.length; i++) {
			next[i][0] = calcNext(i, 0);
			next[i][1] = calcNext(i, 1);
		}
		count = new int[N+2][];
		for (int i = 0; i < count.length; i++) {
			count[i] = new int[1<<(N + 1 - i)];
		}
		int offset = 1;
		for (int i = 0; i <= N; i++) {
			char[] tmp = sc.next().toCharArray();
			for (int j = 0; j < tmp.length; j++) {
				if (tmp[j] == '1') count[0][offset+j] = 1;
			}
			offset *= 2;
		}
		best = new char[0];
		current = new char[N+1];
		bt(0);
		System.out.println(new String(best));
	}
}