#include <iostream>
#include <algorithm>
#include <climits>
#include <string>
#include <cstring>
#include <cmath>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <iomanip>
#include <unordered_map>
#define ll long long
#define fri(a, b) for (int i = a; i < b; i++)
#define frj(a, b) for (int j = a; j < b; j++)
#define frk(a, b) for (int k = a; k < b; k++)
#define frh(a, b) for (int h = a; h < b; h++)
#define rfri(a, b) for (int i = a; i >= b; i--)
#define rfrj(a, b) for (int j = a; j >= b; j--)
#define yes cout << "YES" << "\n";
#define no cout << "NO" << "\n";
#define fast \
ios_base::sync_with_stdio(false); \
cin.tie(NULL); \
cout.tie(NULL);
const int mod=1e9+7;
const int N = 1e6;
using namespace std;
bool isPowerOfTwo(long long x) {
return x > 0 && (x & (x - 1)) == 0;
}
int binarySearch(ll a[], int x, int low, int high) {
// Repeat until the pointers low and high meet each other
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] == x)
return mid;
if (a[mid] < x)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
int main() {
fast int T=1;
cin >> T;
while (T--) {
ll n,k;
cin >> n >> k;
string s;
cin >> s;
vector <ll> v;
ll cnt = 0;
fri(0,n){
if(s[i] == '1') cnt++;
if(s[i] == '0' && i>0 && s[i-1] == '1'){
v.push_back(cnt);
cnt = 0;
}
}
if(cnt > 0) v.push_back(cnt);
sort(v.rbegin(),v.rend());
ll z = min(k+1,(ll)v.size());
ll sum = 0;
fri(0,z) sum += v[i];
cout << sum << "\n";
}
}