#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 1000010, P = 1e9 + 7;
int n, k;
char s[N];
int w[N], one[N];
LL h[N], pre[N];
bool st[N];
LL hashy(int l, int r)
{
return (pre[r] - pre[l-1] * h[r-l+1]%P+P)%P;
}
void solve()
{
scanf("%d%d%s", &n, &k, s + 1);
for(int i = 0; i <= n + 1; i++) st[i] = 0;
for(int i = 1; i <= n; i++)
{
w[i] = s[i] == '0';
pre[i] = (pre[i-1]*2+w[i])%P;
one[i] = one[i-1]+w[i];
}
for(int i = 1; i <= n - k + 1; i++)
{
int x = hashy(max(i, i + k - 20), i + k - 1);
if(k > 20 && one[i+k-20]-one[i-1] > 0 || x > n) continue;
st[x] = 1;
}
int v = -1, d = min(k, 21);
for(int i = 0; i < 1<<d; i++)
if(!st[i])
{
v = i;
break;
}
if(v == -1) puts("NO");
else
{
string ans = "";
printf ("YES\n");
for(int i = 0;i <= k; i ++) ans += '0';
for(int i = 20;i >= 0;i --){
if((v >> i) & 1) ans += '1';
else ans += '0';
}
cout<<ans.substr(ans.size() - k,ans.size())<<endl;
}
}
int main()
{
h[0] = 1;
for(int i = 1; i <= 30; i++) h[i] = h[i-1]*2%P;
int T;
scanf("%d", &T);
while(T--) solve();
return 0;
}
102. Binary Tree Level Order Traversal | 96. Unique Binary Search Trees |
75. Sort Colors | 74. Search a 2D Matrix |
71. Simplify Path | 62. Unique Paths |
50. Pow(x, n) | 43. Multiply Strings |
34. Find First and Last Position of Element in Sorted Array | 33. Search in Rotated Sorted Array |
17. Letter Combinations of a Phone Number | 5. Longest Palindromic Substring |
3. Longest Substring Without Repeating Characters | 1312. Minimum Insertion Steps to Make a String Palindrome |
1092. Shortest Common Supersequence | 1044. Longest Duplicate Substring |
1032. Stream of Characters | 987. Vertical Order Traversal of a Binary Tree |
952. Largest Component Size by Common Factor | 212. Word Search II |
174. Dungeon Game | 127. Word Ladder |
123. Best Time to Buy and Sell Stock III | 85. Maximal Rectangle |
84. Largest Rectangle in Histogram | 60. Permutation Sequence |
42. Trapping Rain Water | 32. Longest Valid Parentheses |
Cutting a material | Bubble Sort |