#include<bits/stdc++.h>
#define ll long long 
#define LL __int128
#define fi first
#define se second
using namespace std;

const int maxn = 1e6 + 5;
int n;
string s, t;
string s1, t1;
queue<int> q[2], q1[2];
bool vis[maxn];

void init(){
	while(!q[0].empty()) q[0].pop();
	while(!q[1].empty()) q[1].pop();
	while(!q1[0].empty()) q1[0].pop();
	while(!q1[1].empty()) q1[1].pop();
}

void solve(int y){
	cin >> n >> s >> t >> s1 >> t1;
	s = " " + s; s1 = " " + s1;
	t = " " + t; t1 = " " + t1;
	for(int i = 1; i <= n; i++){
		if(s1[i] == '0') continue;
		init();
		int j = i; while(s1[j + 1] == '1' && j < n) j++;
		for(int k = i; k <= j; k++) q[s[k] - '0'].push(k);
		for(int k = i; k <= j; k++){
			if(t1[k] == '0'){
				if(s[k] == t[k]) continue;
				int x = t[k] - '0';  
				while(!q[x].empty() && q[x].front() < k) q[x].pop();
				if(!q[x].empty()) swap(s[q[x].front()], s[k]), q[x].pop();
				if(s[k] == t[k]) continue;
				if(!q1[x].empty()) swap(s[q1[x].front()], s[k]), q1[x].pop();
				if(s[k] != t[k]) q1[x].push(k);
			}else{
				q1[s[k] - '0'].push(k);
			}
		}
		i = j;
	}
	for(int i = 1; i <= n; i++){
		if(t1[i] == '0') continue;
		init();
		int j = i; while(t1[j + 1] == '1' && j < n) j++;
		for(int k = i; k <= j; k++) q[t[k] - '0'].push(k);
		for(int k = i; k <= j; k++){
			if(s1[k] == '0'){
				if(s[k] == t[k]) continue;
				int x = s[k] - '0';  
				while(!q[x].empty() && q[x].front() < k) q[x].pop();
				if(!q[x].empty()) swap(t[q[x].front()], t[k]), q[x].pop();
				if(s[k] == t[k]) continue;
				if(!q1[x].empty()) swap(t[q1[x].front()], t[k]), q1[x].pop();
				if(s[k] != t[k]) q1[x].push(k);
			}else{
				q1[t[k] - '0'].push(k);
			}
		}
		i = j;
	}
	int ans = 0;
	int r = 1, r1 = 1;
	init();
	for(int i = 1; i <= n; i++){
		if(s1[i] == '0'){while(!q[0].empty()) q[0].pop(); while(!q[1].empty()) q[1].pop();}
		if(t1[i] == '0'){while(!q1[0].empty()) q1[0].pop(); while(!q1[1].empty()) q1[1].pop();}
		if(r < i){
			for(int j = i; j <= n; j++){
				if(s1[j] == '0') break;
				r = j;
				if(t1[j] == '0') continue;
				q[s[j] - '0'].push(j);
			}
		}
		if(r1 < i){
			for(int j = i; j <= n; j++){
				if(t1[j] == '0') break;
				r1 = j;
				if(s1[j] == '0') continue;
				q1[t[j] - '0'].push(j);
			}
		}
		if(s1[i] == '1' && t1[i] == '1'){
			if(s[i] == t[i]) continue;
			int x = s[i] - '0', y = t[i] - '0';
			while(!q[y].empty() && q[y].front() < i) q[y].pop();
			while(!q1[x].empty() && q1[x].front() < i) q1[x].pop();
			if(!q[y].empty()) swap(s[i], s[q[y].front()]), q[y].pop();
			else if(!q1[x].empty()) swap(t[i], t[q1[x].front()]), q1[x].pop();
		}
	}
	for(int i = 1; i <= n; i++)
		ans += (s[i] - '0') ^ (t[i] - '0') ^ 1;
	cout << ans << '\n';
}

signed main(){
	freopen("edit.in", "r", stdin);
	freopen("edit.out", "w", stdout);
	ios::sync_with_stdio(false);
	cout.tie(0);
	cin.tie(0);

	int t; cin >> t; while(t--) solve(t);

	return 0;
}