题目链接
思路:统计每个0移到前面的贡献,当某个0无法移动最前面的时候特殊处理一下它在那个位置,剩余字符直接复制就好了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+1;
char s[maxn];
int main()
{
int T,flag;
ll n,k,num0;
scanf("%d",&T);
while(T--)
{
string str,temp,temp2;
num0=flag=0;
scanf("%lld %lld",&n,&k);
scanf("%s",s);
int len=strlen(s);
for(int i=0;i<len;++i)
{
if(s[i]=='0')
{
if(k<=i-num0) {
flag=1;
for(int j=i+1;j<len;++j) temp2+=s[j];
break;
}
else k-=i-num0;
s[i]='#';
num0++;
}
if(s[i]=='1') str+=s[i];
}
int size=str.size();
if(flag) temp=str.substr(0,size-k)+'0'+str.substr(size-k,k)+temp2;
else {
for(int i=0;i<len;++i)
{
if(s[i]=='#') continue;
temp+=s[i];
}
}
for(int i=0;i<num0;++i ) printf("0");
cout<<temp<<endl;
}
}