RT,wtcl
#include<bits/stdc++.h>
namespace IO {
inline int read() {
int ret = 0, f = 1;char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -f;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
ret = (ret << 1) + (ret << 3) + (ch ^ 48);
ch = getchar();
}
return ret * f;
}
void write(int x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
}
using namespace std;
using namespace IO;
const int maxn = 1e5 + 5;
int T, n, ans;
int ax[maxn], bx[maxn];
int a[maxn], b[maxn], mova[maxn], movb[maxn], numa[maxn][2], numb[maxn][2], govis[maxn][2];
/*
ax,bx : 两个序列的i号能否移动
mova,movb : 如果能移动,所在区块编号是多少(能移动的点组成的区块
numa, munb : 每个区块里0/1的个数
govis : (两个串里面都可以交换的地方需要最后处理)这样的地方上下区块各自的编号
*/
int main() {
T = read();
while (T--) {
n = read();
for (int i = 1;i <= n;i++) a[i] = getchar() - '0';
getchar();
for (int i = 1;i <= n;i++) b[i] = getchar() - '0';
getchar();
ans = 0;
memset(mova, 0, sizeof(mova));
memset(movb, 0, sizeof(movb));
memset(numa, 0, sizeof(numa));
memset(numb, 0, sizeof(numb));
memset(govis, 0, sizeof(govis));
int tot = 0;
for (int i = 1;i <= n;i++) ax[i] = getchar() - '0';
getchar();
// for (int i = 1;i <= n;i++) {
// cout << a[i];
// }puts("");
// for (int i = 1;i <= n;i++) {
// cout << mova[i];
// }puts("");
// for (int i = 1;i <= tot;i++) cout << numa[i][0] << ' ' << numa[i][1] << '\n';
tot = 0;
for (int i = 1;i <= n;i++) bx[i] = getchar() - '0';
getchar();
for (int i = 1;i <= n;i++) {
if (!ax[i - 1] && !ax[i + 1]) continue;
if (!ax[i - 1]) ax[i] = ++tot;
}
for (int i = 1;i <= n;i++) {
if (!bx[i - 1] && !bx[i + 1]) continue;
if (!bx[i - 1]) bx[i] = ++tot;
}
// for (int i = 1;i <= n;i++) {
// cout << b[i];
// }puts("");
// for (int i = 1;i <= n;i++) {
// cout << movb[i];
// }puts("");
// for (int i = 1;i <= tot;i++) cout << numb[i][0] << ' ' << numb[i][1] << '\n';
int total = 0;
for (int i = 1;i <= n;i++) {
if (mova[i] && !movb[i]) {
if (numa[mova[i]][b[i]]) numa[mova[i]][b[i]], ans++;
else numa[mova[i]][!b[i]]--;
}
if (movb[i] && !mova[i]) {
if (numb[movb[i]][a[i]]) numb[movb[i]][a[i]], ans++;
else numb[movb[i]][!a[i]]--;
}
if (movb[i] && mova[i]) {
if (govis[total][0] == mova[i] && govis[total][1] == movb[i]) continue;
govis[++total][0] = mova[i];
govis[total][1] = movb[i];
}
else ans += (a[i] == b[i]);
}
for (int i = 1;i <= tot;i++) cout << numa[i][0] << ' ' << numa[i][1] << '\n';
for (int i = 1;i <= tot;i++) cout << numb[i][0] << ' ' << numb[i][1] << '\n';
// for (int i = 1;i <= total;i++) cout << govis[i][0] << ' ' << govis[i][1];puts("");
for (int i = 1;i <= tot;i++) {
// if (!govis[i]) continue;
int num0 = min(numa[govis[i][0]][0], numb[govis[i][1]][0]);
int num1 = min(numa[govis[i][0]][1], numb[govis[i][1]][1]);
ans += num0 + num1;
numa[govis[i][0]][0] -= num0, numa[govis[i][0]][1] -= num1;
numb[govis[i][1]][0] -= num0, numb[govis[i][1]][1] -= num1;
}
write(ans), puts("");
}
return 0;
}