#include<iostream>
using namespace std;
#define int long long
int a[200005],pre[200005],nxt[200005];
signed main(){
ios::sync_with_stdio(0);
int t,cnt=0;
cin>>t;
while(t--){
cnt++;
int n,k;
string s;
cin>>n>>k>>s;
for(int i=1;i<=n;i++){
cin>>a[i];
if(s[i-1]=='0') a[i]=-1e13;
}
int maxx=-1e18;
for(int i=1;i<=n;i++){
pre[i]=max(max(pre[i-1]+a[i],a[i]),0ll);
maxx=max(maxx,pre[i]);
}
if(maxx>k){
cout<<"No\n";
continue;
}
if(maxx==k){
cout<<"Yes\n";
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<'\n';
continue;
}
for(int i=n;i>=1;i--){
nxt[i]=max(max(nxt[i+1]+a[i],a[i]),0ll);
}
bool flag=0;
for(int i=1;i<=n;i++){
if(s[i-1]=='0'){
a[i]=k-pre[i-1]-nxt[i+1];
flag=1;
break;
}
}
if(!flag){
cout<<"No\n";
continue;
}
cout<<"Yes\n";
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<'\n';
}
return 0;
}
显示有一组数据按我这样构造求出的最大子区间和不为 k