#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int T, n, l1[N], r1[N], l2[N], r2[N];
char s1[N], s2[N], c1[N], c2[N];
struct Node {
int e[N];
void update(int x, int y) {
for (int i = x; i <= n; i += i & -i) {
e[i] += y;
}
}
int query(int x) {
int res = 0;
for (int i = x; i >= 1; i -= i & -i) {
res += e[i];
}
return res;
}
} tr[3][2];
int main() {
freopen("edit.in", "r", stdin);
freopen("edit.out", "w", stdout);
cin >> T;
while (T--) {
scanf("%d", &n);
scanf("%s", s1 + 1);
scanf("%s", s2 + 1);
scanf("%s", c1 + 1);
scanf("%s", c2 + 1);
memset(tr[1][0].e, 0, sizeof tr[1][0].e);
memset(tr[1][1].e, 0, sizeof tr[1][1].e);
memset(tr[2][0].e, 0, sizeof tr[2][0].e);
memset(tr[2][1].e, 0, sizeof tr[2][1].e);
memset(l1, 0, sizeof l1);
memset(l2, 0, sizeof l2);
memset(r1, 0, sizeof r1);
memset(r2, 0, sizeof r2);
for (int i = 1; i <= n; i++) {
if (s1[i] == '0') tr[1][0].update(i, 1);
else tr[1][1].update(i, 1);
if (s2[i] == '0') tr[2][0].update(i, 1);
else tr[2][1].update(i, 1);
}
for (int i = 1; i <= n; i++) {
if (c1[i] == '0') l1[i] = 0;
else {
if (l1[i-1] == 0) l1[i] = i;
else l1[i] = l1[i-1];
}
if (c2[i] == '0') l2[i] = 0;
else {
if (l2[i-1] == 0) l2[i] = i;
else l2[i] = l2[i-1];
}
}
for (int i = n; i >= 1; i--) {
if (c1[i] == '0') r1[i] = 0;
else {
if (r1[i+1] == 0) r1[i] = i;
else r1[i] = r1[i+1];
}
if (c2[i] == '0') r2[i] = 0;
else {
if (r2[i+1] == 0) r2[i] = i;
else r2[i] = r2[i+1];
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
if (c1[i] == '0' && c2[i] == '0') {
if (s1[i] == s2[i]) ++ans;
} else if (c1[i] == '0') {
int num = s1[i] - '0';
int temp = tr[2][num].query(r2[i]) - tr[2][num].query(l2[i]-1);
if (temp >= 1) {
++ans;
tr[2][num].update(i, -1);
}
} else if (c2[i] == '0') {
int num = s2[i] - '0';
int temp = tr[1][num].query(r1[i]) - tr[1][num].query(l1[i]-1);
if (temp >= 1) {
++ans;
tr[1][num].update(i, -1);
}
}
}
for (int i = 1; i <= n; i++) {
if (c1[i]!='0'&&c2[i]!='0' && (i==1 || !(c1[i-1]!='0' && c2[i-1]!='0'))) {
int u1 = tr[1][0].query(r1[i]) - tr[1][0].query(l1[i]-1);
int u2 = tr[1][1].query(r1[i]) - tr[1][1].query(l1[i]-1);
int d1 = tr[2][0].query(r2[i]) - tr[2][0].query(l2[i]-1);
int d2 = tr[2][1].query(r2[i]) - tr[2][1].query(l2[i]-1);
int m1 = min(u1, d1), m2 = min(u2, d2), len = min(r1[i], r2[i]) - max(l1[i], l2[i]) + 1;
m1 = min(m1, len);
m2 = min(m2, len);
ans += m1 + m2;
tr[1][0].update(i, -m1);
tr[2][0].update(i, -m1);
tr[1][1].update(i, -m2);
tr[2][1].update(i, -m2);
}
}
printf("%d\n", ans);
}
fclose(stdin);
fclose(stdout);
return 0;
}