#include <bits/stdc++.h>
using namespace std;
void ALERT() {
cout << "\tALERT!" << endl;
}
void solve() {
int n;
cin >> n;
string s1, s2, t1, t2;
cin >> s1 >> s2 >> t1 >> t2;
bool l1[n], l2[n], b1[n], b2[n];
for(int i = 0; i < n; i++) {
l1[i] = (s1.at(i) == '1');
l2[i] = (s2.at(i) == '1');
b1[i] = (t1.at(i) == '1');
b2[i] = (t2.at(i) == '1');
}
if(!b1[1]) b1[0] = 0;
if(!b1[n - 2]) b1[n - 1] = 0;
if(!b2[1]) b2[0] = 0;
if(!b2[n - 2]) b2[n - 1] = 0;
for(int i = 1; i < n - 1; i++) {
if(b1[i] && !b1[i - 1] && !b1[i + 1]) {
b1[i] = 0;
}
if(b2[i] && !b2[i - 1] && !b2[i + 1]) {
b2[i] = 0;
}
}
int ans = 0;
for(int i = 0; i < n; i++) {
if(!b1[i] && !b2[i] && l1[i] == l2[i]) {
ans++;
}
}
vector<pair<int, int>> qj1, qj2;
qj1.push_back(pair<int, int>(0, 0));
qj2.push_back(pair<int, int>(0, 0));
int s = 0, e = 0;
while(s < n) {
if(b1[s]) {
for(e = s + 1; b1[e] && e < n; e++);
qj1.push_back(pair<int, int>(s, e));
s = e + 1;
} else {
s++;
continue;
}
}
s = 0, e = 0;
while(s < n) {
if(b2[s]) {
for(e = s + 1; b2[e] && e < n; e++);
qj2.push_back(pair<int, int>(s, e));
s = e + 1;
} else {
s++;
continue;
}
}
qj1.push_back(pair<int, int>(n, n));
qj2.push_back(pair<int, int>(n, n));
int info1[n][2];
memset(info1, 0, sizeof(info1));
for(int i = 0; i < qj1.size(); i++) {
for(int j = qj1[i].first; j < qj1[i].second; j++) {
if(l1[j]) info1[i][1]++;
else info1[i][0]++;
}
}
int info2[n][2];
memset(info2, 0, sizeof(info2));
for(int i = 0; i < qj2.size(); i++) {
for(int j = qj2[i].first; j < qj2[i].second; j++) {
if(l2[j]) info2[i][1]++;
else info2[i][0]++;
}
}
for(int i = 1; i < qj1.size() - 1; i++) {
for(int j = 0; j < qj2.size() - 1; j++) {
pair<int, int> lockRange(qj2[j].second, qj2[j + 1].first);
if(lockRange.second <= qj1[i].first) continue;
if(lockRange.first >= qj1[i].second) break;
int f = max(qj1[i].first, lockRange.first), t = min(qj1[i].second, lockRange.second);
int co1 = 0, co0 = 0;
for(int i = f; i < t; i++) {
if(l2[i] == 1) co1++;
else co0++;
}
ans += min(info1[i][0], co0) + min(info1[i][1], co1);
info1[i][1] -= min(info1[i][1], co1);
info1[i][0] -= min(info1[i][0], co0);
}
}
for(int i = 1; i < qj2.size() - 1; i++) {
for(int j = 0; j < qj1.size() - 1; j++) {
pair<int, int> lockRange(qj1[j].second, qj1[j + 1].first);
if(lockRange.second <= qj2[i].first) continue;
if(lockRange.first >= qj2[i].second) break;
int f = max(qj2[i].first, lockRange.first), t = min(qj2[i].second, lockRange.second);
int co1 = 0, co0 = 0;
for(int i = f; i < t; i++) {
if(l1[i] == 1) co1++;
else co0++;
}
ans += min(info2[i][0], co0) + min(info2[i][1], co1);
info2[i][1] -= min(info2[i][1], co1);
info2[i][0] -= min(info2[i][0], co0);
}
}
for(int i = 1; i < qj1.size() - 1; i++) {
for(int j = 1; j < qj2.size() - 1; j++) {
if(qj2[j].second <= qj1[i].first) continue;
if(qj2[j].first >= qj1[i].second) break;
int f = max(qj1[i].first, qj2[j].first);
int t = min(qj1[i].second, qj2[j].second);
int cha = t - f;
int co1 = min(info1[i][1], info2[j][1]);
int co0 = min(info1[i][0], info2[j][0]);
int temp = min(cha, co0);
ans += temp;
cha -= temp;
info1[i][0] -= temp;
info2[j][0] -= temp;
temp = min(cha, co1);
ans += temp;
cha -= temp;
info1[i][1] -= temp;
info2[j][1] -= temp;
}
}
cout << ans << endl;
}
int main() {
freopen("edit.in", "r", stdin);
freopen("edit.out", "w", stdout);
int t;
cin >> t;
for(int i = 0; i < t; i++) {
solve();
}
}