#include <bits/stdc++.h>
using namespace std;
vector<int> locks(string s) {
vector<int> ret;
int n = s.size();
for (int i = 0; i < n; i++)
if (s[i] == '0') ret.push_back(i);
return ret;
}
vector<int> fore(string s) {
vector<int> a, pre;
for (char &c : s) a.push_back(c - '0');
partial_sum(a.begin(), a.end(), back_inserter(pre));
pre.insert(pre.begin(), 0);
return pre;
}
void solve() {
int n;
cin >> n;
string s1, s2, t1, t2;
cin >> s1 >> s2 >> t1 >> t2;
vector<int> lc1 = locks(t1), lc2 = locks(t2);
lc1.push_back(n), lc2.push_back(n);
vector<int> p1 = fore(s1), p2 = fore(s2);
int ans = 0, rm1[2], rm2[2];
rm1[1] = p1[lc1[0]], rm2[1] = p2[lc2[0]], rm1[0] = lc1[0] - rm1[1], rm2[0] = lc2[0] - rm2[1];
for (int l = 0; l < n; ) {
int nl1 = *upper_bound(lc1.begin(), lc1.end(), l);
int nl2 = *upper_bound(lc2.begin(), lc2.end(), l);
if (t1[l] == '0' && t2[l] == '0') {
ans += (s1[l] == s2[l]), l++;
rm1[1] = p1[nl1] - p1[l], rm1[0] = nl1 - l - rm1[1];
rm2[1] = p2[nl2] - p2[l], rm2[0] = nl2 - l - rm2[1];
} else if (t1[l] == '0') {
if (rm2[s1[l] - '0'] > 0)
rm2[s1[l] - '0']--, l++, rm1[1] = p1[nl1] - p1[l], rm1[0] = nl1 - l - rm1[1], ans++;
else
rm2[!(s1[l] - '0')]--, l++, rm1[1] = p1[nl1] - p1[l], rm1[0] = nl1 - l - rm1[1];
} else if (t2[l] == '0') {
if (rm1[s2[l] - '0'] > 0)
rm1[s2[l] - '0']--, l++, rm2[1] = p2[nl2] - p2[l], rm2[0] = nl2 - l - rm2[1], ans++;
else
rm1[!(s2[l] - '0')]--, l++, rm2[1] = p2[nl2] - p2[l], rm2[0] = nl2 - l - rm2[1];
} else {
int M0 = min(rm1[0], rm2[0]), M1 = min(rm1[1], rm2[1]), D = min(nl1, nl2) - l - M0 - M1;
rm1[0] -= M0, rm2[0] -= M0, rm1[1] -= M1, rm2[1] -= M1;
if (nl1 < nl2) {
rm1[0] = rm1[1] = 0;
if (rm2[0] == 0) rm2[1] -= D; else rm2[0] -= D;
} else {
rm2[0] = rm2[1] = 0;
if (rm1[0] == 0) rm1[1] -= D; else rm1[0] -= D;
}
ans += M0 + M1, l = min(nl1, nl2);
}
}
cout << ans << endl;
}
int main() {
freopen("edit.in", "r", stdin);
freopen("edit.out", "w", stdout);
int T;
cin >> T;
while (T--) solve();
}