#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
string s;
cin >> n >> s;
if (n == 1) {
// Only one char:
// press = 1, plus move if it's '1'
cout << 1 + (s[0]=='1') << "\n";
continue;
}
int T01 = 0, T10 = 0;
for (int i = 0; i+1 < n; i++) {
if (s[i]=='0' && s[i+1]=='1') T01++;
else if (s[i]=='1' && s[i+1]=='0') T10++;
}
int trans = T01 + T10;
int start = (s[0]=='1');
// How many moves can we cut out?
int best_delta = 0;
// (A) Cut 2 if possible:
if (T01 >= 2 || T10 >= 2) {
best_delta = 2;
} else if (s[0]=='1' && T01 >= 1) {
// flip the very first '1'→'0' _and_ collapse one 0→1
best_delta = 2;
}
// (B) Otherwise, maybe cut 1:
if (best_delta == 0) {
// 1) merge one internal boundary against the end
bool boundary1 = false;
for (int i = 0; i+1 < n; i++) {
if (s[i] != s[i+1] && s[i] == s[n-1]) {
boundary1 = true;
break;
}
}
// 2) flip only the very first move by reversing a prefix that ends
// in a '0' (so start 1→0) without introducing a new boundary
bool flip_start = (s[0]=='1' && s[n-1]=='0');
if (boundary1 || flip_start)
best_delta = 1;
}
int ans = n + start + trans - best_delta;
cout << ans << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgdDsgCiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBpbnQgbjsKICAgICAgICBzdHJpbmcgczsKICAgICAgICBjaW4gPj4gbiA+PiBzOwoKICAgICAgICBpZiAobiA9PSAxKSB7CiAgICAgICAgICAgIC8vIE9ubHkgb25lIGNoYXI6IAogICAgICAgICAgICAvLyBwcmVzcyA9IDEsIHBsdXMgbW92ZSBpZiBpdCdzICcxJwogICAgICAgICAgICBjb3V0IDw8IDEgKyAoc1swXT09JzEnKSA8PCAiXG4iOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGludCBUMDEgPSAwLCBUMTAgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpKzEgPCBuOyBpKyspIHsKICAgICAgICAgICAgaWYgICAgICAoc1tpXT09JzAnICYmIHNbaSsxXT09JzEnKSBUMDErKzsKICAgICAgICAgICAgZWxzZSBpZiAoc1tpXT09JzEnICYmIHNbaSsxXT09JzAnKSBUMTArKzsKICAgICAgICB9CiAgICAgICAgaW50IHRyYW5zID0gVDAxICsgVDEwOwogICAgICAgIGludCBzdGFydCA9IChzWzBdPT0nMScpOwoKICAgICAgICAvLyBIb3cgbWFueSBtb3ZlcyBjYW4gd2UgY3V0IG91dD8KICAgICAgICBpbnQgYmVzdF9kZWx0YSA9IDA7CgogICAgICAgIC8vIChBKSBDdXQgMiBpZiBwb3NzaWJsZToKICAgICAgICBpZiAoVDAxID49IDIgfHwgVDEwID49IDIpIHsKICAgICAgICAgICAgYmVzdF9kZWx0YSA9IDI7CiAgICAgICAgfSBlbHNlIGlmIChzWzBdPT0nMScgJiYgVDAxID49IDEpIHsKICAgICAgICAgICAgLy8gZmxpcCB0aGUgdmVyeSBmaXJzdCAnMSfihpInMCcgX2FuZF8gY29sbGFwc2Ugb25lIDDihpIxCiAgICAgICAgICAgIGJlc3RfZGVsdGEgPSAyOwogICAgICAgIH0KCiAgICAgICAgLy8gKEIpIE90aGVyd2lzZSwgbWF5YmUgY3V0IDE6CiAgICAgICAgaWYgKGJlc3RfZGVsdGEgPT0gMCkgewogICAgICAgICAgICAvLyAxKSBtZXJnZSBvbmUgaW50ZXJuYWwgYm91bmRhcnkgYWdhaW5zdCB0aGUgZW5kCiAgICAgICAgICAgIGJvb2wgYm91bmRhcnkxID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpKzEgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChzW2ldICE9IHNbaSsxXSAmJiBzW2ldID09IHNbbi0xXSkgewogICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5MSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gMikgZmxpcCBvbmx5IHRoZSB2ZXJ5IGZpcnN0IG1vdmUgYnkgcmV2ZXJzaW5nIGEgcHJlZml4IHRoYXQgZW5kcwogICAgICAgICAgICAvLyAgICBpbiBhICcwJyAoc28gc3RhcnQgMeKGkjApIHdpdGhvdXQgaW50cm9kdWNpbmcgYSBuZXcgYm91bmRhcnkKICAgICAgICAgICAgYm9vbCBmbGlwX3N0YXJ0ID0gKHNbMF09PScxJyAmJiBzW24tMV09PScwJyk7CgogICAgICAgICAgICBpZiAoYm91bmRhcnkxIHx8IGZsaXBfc3RhcnQpCiAgICAgICAgICAgICAgICBiZXN0X2RlbHRhID0gMTsKICAgICAgICB9CgogICAgICAgIGludCBhbnMgPSBuICsgc3RhcnQgKyB0cmFucyAtIGJlc3RfZGVsdGE7CiAgICAgICAgY291dCA8PCBhbnMgPDwgIlxuIjsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==