思路:
1.每输入进来一个0,看它是否能移动到最前端(前面不存在字符‘1’即为最前端),计算所需要的移动次数,和k做比较;
2.k够用就输出一个0;不够的话计算最多能移动到哪,输出相应数量的1,再输出这个0,再输出剩下的1,然后既然k用完了,接下来输入什么就输出什么;
3.输入输出的数据量较多,可以考虑优化一下cin和cout,或者直接用scanf和getchar;
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
const int MAX_N=1000005;
int main(){
int q;
scanf("%d",&q);
rp(i,q){
ll n,k;
scanf("%lld %lld",&n,&k);
getchar();
ll ans=0;//统计当前0的个数
bool flag=false;//k是否被用完
rp(j,n){
char c=getchar();
if(flag) putchar(c);
else if(c=='0'){
ll d=j-ans;//移到最前面所需要的次数
if(k<=d){//k被用完了,不够0被移到最前面
ll pos=j-k;
for(pos=ans;pos<j-k;pos++) putchar('1');
putchar('0');
for(pos++;pos<j+1;pos++) putchar('1');
flag=true;
}else putchar('0'); //k足够此次的0被移到最前端
ans++;
k-=d;
}
}
if(k>0) for(int pos=ans;pos<n;pos++) putchar('1');//k没有被用完
putchar('
');
}
return 0;
}