
//仅供个人学习记录
#include<iostream>
using namespace std;
int main() {
//题目分析:
//代价是字符串长度(按下的次数)加上切换的次数
//题目的目的是为了减少切换的次数
int t;
cin >> t;
for (int i = 0; i < t; i++) {
string s;
int n;
cin >> n >> s;
int change = 0;
//此时要判断首位是0还是1 可以直接用if判断 也可以在字符串最前面加1个0
//此时长度是n+1 那如果这样的话直接遍历j和j-1项就好了
s = '0' + s;
for (int j = 1; j <= n; j++) {
if (s[j] != s[j - 1]) {
change++;
}
}
//此时开始分类讨论
// 注:n就是原本的长度 不需要在因为最前面的0多减1
//如果变换就一次 例 10000 7次(变换2次) 00001 6次 省去变1 变回来 00100 和10000是一样的
//所以如果变换一次可以发现 不需要换 就是最优解
if (change <= 1) cout << n + change << endl;
//然后看两次变换的 10000 01000 可以通过变换 变成1次00001 这个也是最优解 比如 00100 00001
else if(change == 2) cout << n + change - 1 << endl;
//然后看3次变换的 01001 10001 都可以通过改变顺序 变成 00011 这样就只剩一次变换
//本题通过读题可以发现 最多就节约两次 (旋转的首尾各节约一次 )
else if(change>=3) cout << n + change - 2 << endl;
//change = 0;//重置
}
return 0;
}