/*
                                                  
  _|_|                              _|  _|    _|  
_|    _|  _|  _|_|  _|_|_|_|        _|  _|  _|    
_|    _|  _|_|          _|          _|  _|_|      
_|    _|  _|          _|      _|    _|  _|  _|    
  _|_|    _|        _|_|_|_|    _|_|    _|    _|  
                                                                                                    
*/ 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<unordered_map>
//#define ls (rt<<1)
//#define rs (rt<<1|1)
#define vi vector<int>
#define pb push_back
#define mk make_pair
#define pii pair<int,int>
#define rep(i,a,b) for(int i=(a),i##end=(b);i<=i##end;i++)
#define fi first
#define se second
typedef long long ll;
using namespace std;
const int maxn=1e6+100;
char s[maxn],trans[maxn];
int n,k;
struct Hash{
	int pow[maxn],mod,base,pre[maxn];
	unordered_map<int,bool>ck;
	int tar[maxn];
	int ksm(int num,int t){
		int res=1;
		for(;t;t>>=1,num=1ll*num*num%mod){
			if(t&1)res=1ll*num*res%mod;
		}
		return res;
	}
	void build(){
		pow[0]=1;
		rep(i,1,maxn-1)pow[i]=1ll*pow[i-1]*base%mod;
	}
	void init(){
		ck.clear();
		rep(i,1,n)pre[i]=1ll*pow[i]*s[i]%mod;
		rep(i,1,n)pre[i]=(pre[i]+pre[i-1])%mod;
		rep(i,1,k)tar[i]=1ll*pow[i]*trans[i]%mod;
		rep(i,1,k)tar[i]=(tar[i]+tar[i-1])%mod;
	}
	int seg(int l,int r){
		int res=1ll*(pre[r]-pre[l-1])*ksm(pow[l-1],mod-2)%mod;
		res=(res%mod+mod)%mod;
		return res;
	}
	void recalc(int st){
		rep(i,st,k){
			tar[i]=1ll*pow[i]*trans[i]%mod;
			tar[i]=(tar[i]+tar[i-1])%mod;
		}
	}
}h[2];
void solve(){
	scanf("%d%d",&n,&k);rep(i,1,k)trans[i]='1';
	scanf("%s",s+1);h[0].init();h[1].init();
	for(int l=1,r=k;r<=n;l++,r++){
		h[0].ck[h[0].seg(l,r)]=1;
		h[1].ck[h[1].seg(l,r)]=1;
	}
	if(!h[0].ck[h[0].tar[k]]||!h[1].ck[h[1].tar[k]]){
		printf("YES\n");
		rep(i,1,k)printf("%d",(trans[i]-'0')^1);printf("\n");return;
	}
	ll lim=0;
	if(k>23)lim=(1<<23);
	else lim=(1<<k)-2;
	for(ll i=lim;i>=0;i--){
		int flag=-1;
		for(int j=k;j>=1;j--){
			if(trans[j]=='1'){trans[j]='0';flag=j;break;}
			else {trans[j]='1';}
		}
		h[0].recalc(flag);h[1].recalc(flag);
		if(!h[0].ck[h[0].tar[k]]||!h[1].ck[h[1].tar[k]]){
			printf("YES\n");
			rep(i,1,k)printf("%d",(trans[i]-'0')^1);printf("\n");return;
		}
	}
	printf("NO\n");
}
int main(){
	h[0].mod=998244353;h[0].base=233;h[0].build();
	h[1].mod=1e9+7;h[1].base=2333;h[1].build();
	int t;scanf("%d",&t);
	while(t--)solve();
}
