// I love 鸠
// I love Gino
// I love Cthohlly
#include <bits/stdc++.h>
#define endl '\n'

using namespace std;

using ll = long long;

const ll N = 1e5 + 5;

int n, m1, m2, ans, idx1[N], idx2[N];
queue<int> q1[N][2], q2[N][2];
string s1, s2, t1, t2;

void init() {}

namespace A {
bool check() {
	for (int i = 2; i <= n; ++i) {
		if (s1[i] != s1[i - 1]) return 0;
	}
	return 1;
}
void solve() {
	for (int i = 1; i <= n; ++i) {
		if (s1[i] == s2[i]) ++ans;
	}
	cout << ans << endl;
}
}

namespace B {
bool check() {
	if (t1 == t2) return 1;
	return 0;
}
void solve() {
	++n;
	t1 += '0', t2 += '0', s1 += '1', s2 += '0';
	for (int i = 1, cnt11 = 0, cnt10 = 0, cnt21 = 0, cnt20 = 0; i <= n; ++i) {
		if (t1[i] == '0' || i == n) {
			ans += min(cnt11, cnt21) + min(cnt10, cnt20) + (s1[i] == s2[i]);
			cnt11 = cnt10 = cnt21 = cnt20 = 0;
			continue;
		}
		if (s1[i] == '1') ++cnt11;
		else ++cnt10;
		if (s2[i] == '1') ++cnt21;
		else ++cnt20;
	}
	cout << ans << endl;
}
}

// 你或许也意识到了这件事——
// 硬币掷出之后，正反的转互从未停止。
// 旅船是掩盖未来的虚像，战车正指引着我们的命运。
// 前方是毁灭亦是重生

int get1(int i, bool f) {
	while (q1[idx1[i]][f].front() < i) q1[idx1[i]][f].pop();
	int t = q1[idx1[i]][f].front();
	q1[idx1[i]][f].pop();
	return t;
}

int get2(int i, bool f) {
	while (q2[idx2[i]][f].front() < i) q2[idx2[i]][f].pop();
	int t = q2[idx2[i]][f].front();
	q2[idx2[i]][f].pop();
	return t;
}

void solve() {
	ans = 0;
	cin >> n >> s1 >> s2 >> t1 >> t2;
	s1 = ' ' + s1, s2 = ' ' + s2, t1 = ' ' + t1, t2 = ' ' + t2;
	if (A::check()) return A::solve();
	if (B::check()) return B::solve();
	m1 = m2 = 1;
	for (int i = 1; i <= n; ++i) {
		while (q1[i][0].size()) q1[i][0].pop();
		while (q1[i][1].size()) q1[i][1].pop();
		while (q2[i][0].size()) q2[i][0].pop();
		while (q2[i][1].size()) q2[i][1].pop();
	}
	for (int i = 1; i <= n; ++i) {
		if (t1[i] == '0') ++m1;
		else {
			q1[m1][s1[i] - 48].push(i);
			idx1[i] = m1;
		}
		if (t2[i] == '0') ++m2;
		else {
			q2[m2][s2[i] - 48].push(i);
			idx2[i] = m2;
		}
	}
	for (int i = 1; i <= n; ++i) {
		bool f1 = s1[i] - 48, f2 = s2[i] - 48;
		if (t1[i] != '0') {
			if (q1[idx1[i]][f2].size()) {
				swap(s1[i], s1[get1(i, f2)]);
				cout << "A" << i << endl;
				if (idx2[i]) q2[idx2[i]][f2].pop();
			}
			else if (q2[idx2[i]][f1].size()) {
				swap(s2[i], s2[get2(i, f1)]);
				cout << s2 << endl;
				q1[idx1[i]][f1].pop();
			}
			else if (idx2[i]) q2[idx2[i]][f2].pop();
		}
		else {
			if (q2[idx2[i]][f1].size()) swap(s2[i], s2[get2(i, f1)]);
			else q2[idx2[i]][f2].pop();
		}
		cout << s1 << ' ' << s2 << endl;
	}
	for (int i = 1; i <= n; ++i) ans += s1[i] == s2[i];
	cout << ans << endl;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	freopen("edit.in", "r", stdin);
	freopen("edit.out", "w", stdout);
	// freopen("edit.in", "r", stdin);
	// freopen("edit.out", "w", stdout);
	int _ = 1;
	cin >> _;
	while (_--) solve();
	return 0;
}
/*
g++ edit.cpp -o edit.exe -std=c++14 -O2 -fno-asm -Wall
*/
/*
9:00 AB性质打满了，正解只想了个状态定义，不知道怎么转移
9:28 有没有一种可能，局部最优=全局最优。如果是这样那么完全不用dp。
	 不会证，但大概是这样的。 
9:31 证：   1   ?   1
				^不可交换
				1
		1匹配左边或右边不影响答案
		证毕
	直接贪
	根据t[i]=0分段，记录1和0的个数，然后开干
10:56 废了，调不出来
*/