对于给定的字符串,算出字符串中0的个数,1的个数,记d为min({0的个数,1的个数,k})那么最多将从前往后数d个1与从后往前数d个0交换,注意当n为2时,因为要恰好交换k次所以当k为奇数时,01这种字符串得交换一次成10
c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
void solve() {
小红有一个长为n的只由0和1组成的串s,他需要恰好对s执行k次交换操作。小红想要使得s的字典序最小,
请你帮帮他求出最小字典序的s吧。 选择两个不同的下标并交换这两个位置上的值称为一次交换,使用数学的方式描述,即选择和j(1≤i<j≤n)并交换si和sj。 当且仅当满足以下条件之一时,字符串a按字典顺序小于字符串b:
每个测试文件均包含多组测试数据。
第一行输入一个整数T(1≤T≤104)代表数据组数,每组测试数据描述如下:
第一行输入两个整数n和k(2≤n≤2×105;1≤k≤109)代表s的长度和操作次数。
第二行输入一个长为n,且只由'0'和'1'组成的字符串s。 除此之外,保证所有的n之和不超过2×105。
对于每一组测试数据,在一行上输出一个长度为n,且只由0和1组成的字符串,代表进行了恰好k次操作后,字典序最小的s。
输入
2
6 2
110000
2 10
11
输出
000011
11
说明
对于第一组测试数据,需要恰好进行k=2次操作,依次交换s1,s6和s2,s5。