Rt.
#include <bits/stdc++.h>
using namespace std;
#define ls (id * 2)
#define rs (id * 2 + 1)
#define lowbit(x) x&(-x)
#define fi first
#define se second
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
const int N = 1e5 + 5;
int T, n;
int s1[N], s2[N], t1[N], t2[N];
int pos1[N], pos2[N], cnt, num1[N][2], num2[N][2];
int ans;
void init(void) {
cnt = 0;
memset(pos1, 0, sizeof pos1);
memset(pos2, 0, sizeof pos2);
ans = 0;
memset(num1, 0, sizeof num1);
memset(num2, 0, sizeof num2);
return ;
}
int main(void) {
scanf("%d", &T);
while (T--) {
init();
cin >> n;
for (int i = 1; i <= n; ++i) {
scanf("%1d", &s1[i]);
}
for (int i = 1; i <= n; ++i) {
scanf("%1d", &s2[i]);
}
for (int i = 1; i <= n; ++i) {
scanf("%1d", &t1[i]);
}
for (int i = 1; i <= n; ++i) {
scanf("%1d", &t2[i]);
}
s1[0] = s2[0] = -1;
cnt = 0;
for (int i = 1; i <= n; ++i) {
if (s1[i] != s1[i-1]) pos1[i] = ++cnt; // 记录每个位置的字符属于哪一个段。
else pos1[i] = pos1[i-1];
num1[pos1[i]][s1[i]]++; // 每一个段的 0,1 个数
}
cnt = 0;
for (int i = 1; i <= n; ++i) {
if (s2[i] != s2[i-1]) pos2[i] = ++cnt;
else pos2[i] = pos2[i-1];
num2[pos2[i]][s2[i]]++;
}
for (int i = 1; i <= n; ++i) {
if (t1[i] == 0 && t2[i] == 0) {
if (s1[i] == s2[i]) {
++ans;
}
}
else if (t1[i] == 0) {
if (num2[pos2[i]][s1[i]] > 0) {
--num2[pos2[i]][s1[i]];
++ans;
}
}
else if (t2[i] == 0) {
if (num1[pos1[i]][s2[i]] > 0) {
--num1[pos1[i]][s2[i]];
++ans;
}
}
}
for (int i = 1; i <= n; ++i) {
if (t1[i] == 1 && t2[i] == 1) {
if (num1[pos1[i]][0] > 0 && num2[pos2[i]][0] > 0) {
--num1[pos1[i]][0], --num2[pos2[i]][0];
++ans;
}
else if (num1[pos1[i]][1] > 0 && num2[pos2[i]][1] > 0) {
--num1[pos1[i]][1], --num2[pos2[i]][1];
++ans;
}
}
}
printf("%d\n", ans);
}
return 0;
}