#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int T, n, nxt[2][N];
char s[2][N], t[2][N];

struct segment_tree{
	int val[2][N << 2];

	#define ls(o) (o << 1) 
	#define rs(o) (o << 1 | 1) 
	
	void init(){
		memset(val, 0, sizeof(val));
	}
	
	void build(int o, int l, int r, int id){
		if(l == r)
			return val[s[id][l] - '0'][o] = 1, void();
		int mid = (l + r) >> 1;
		build(ls(o), l, mid, id);
		build(rs(o), mid + 1, r, id);
		val[0][o] = val[0][ls(o)] + val[0][rs(o)];
		val[1][o] = val[1][ls(o)] + val[1][rs(o)];
	}
	
	void update(int o, int l, int r, int p, int v){//p 改成 v 
		if(l == r){
			val[v][o]++, val[v ^ 1][o]--;
			return ;
		}
		int mid = (l + r) >> 1;
		if(p <= mid)
			update(ls(o), l, mid, p, v);
		else
			update(rs(o), mid + 1, r, p, v);
		val[0][o] = val[0][ls(o)] + val[0][rs(o)];
		val[1][o] = val[1][ls(o)] + val[1][rs(o)];
	}
	
	int query(int o, int l, int r, int s, int t, int v){//s, t 内第一个 v 的位置 
		if(l > r || s > t)
			return -1;
		if(!val[v][o])
			return -1;
		if(l == r)
			return val[v][o] ? l : -1;
		int mid = (l + r) >> 1;
		if(t <= mid)
			return query(ls(o), l, mid, s, t, v);
		if(s > mid)
			return query(rs(o), mid + 1, r, s, t, v);
		int res = query(ls(o), l, mid, s, t, v);
		if(~res)
			return res;
		return query(rs(o), mid + 1, r, s, t, v);
	}
} tree[2];

bool change(int id, int p){//从 s[id][p] 之后找一个不同的数交换过来 
	int v = (s[id][p] - '0') ^ 1;
	int q = tree[id].query(1, 1, n, p + 1, nxt[id][p] - 1, v);
	if(q == -1)
		return 0;
	swap(s[id][p], s[id][q]);
	tree[id].update(1, 1, n, p, s[id][p] - '0');
	tree[id].update(1, 1, n, q, s[id][q] - '0');
	return 1;
}

void solve(){
	scanf("%d", &n);
	scanf("%s", s[0] + 1);
	scanf("%s", s[1] + 1);
	scanf("%s", t[0] + 1);
	scanf("%s", t[1] + 1);
	int lst = n + 1;
	tree[0].init(), tree[1].init();
	tree[0].build(1, 1, n, 0), tree[1].build(1, 1, n, 1);
	for(int i=n;i>=1;i--){
		if(t[0][i] == '0')
			lst = i;
		nxt[0][i] = lst;
	}
	lst = n + 1;
	for(int i=n;i>=1;i--){
		if(t[1][i] == '0')
			lst = i;
		nxt[1][i] = lst;
	}
	for(int i=1;i<=n;i++){
		if(s[0][i] != s[1][i]){
			if(t[0][i] == '0' && t[1][i] == '0')
				continue;
			else if(t[0][i] == '0')
				change(1, i);
			else if(t[1][i] == '0')
				change(0, i);
			else{
				bool f = change(0, i);
				if(!f)
					change(1, i);
			}
		}
	}
	int ans = 0;
	for(int i=1;i<=n;i++)
		ans += (s[0][i] == s[1][i]);
	printf("%d\n", ans);
}

int main(){
	freopen("edit.in", "r", stdin);
	freopen("edit.out", "w", stdout);
	scanf("%d", &T);
	while(T--)
		solve();
	return 0;
}
/*
可是，少年，当你最后一次行云流水地写下线段树的时候，是否还记得，

当初懵懵懂懂的自己，曾经觉得这是一个多么难的知识？

五年的路说短不短，说长不长，有苦，有甜，有笑，有哭，有辛酸，有幸福，有泪水，有笑容 

OI 见证着我从小学生蜕变为一名义忠仁，我又因为它最终选择离开这温暖的家。
可以说，OI 几乎贯穿了我整个青春，几乎影响了我生活的一切。 

现在是 2024年11月30号 12:54，距离我告别 OI，仅剩 6 分钟。

最后还是想说，感谢 OI，感谢所有帮助过我的同学、老师，感谢一直支持我的父母。

感恩相遇，我们大学，有缘再见…… 
*/
