#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lowbit(x) (x&-x)
#define N 100010
int T;
int n,ans,num,tob;
char s[2][N],t[2][N];
int bel[2][N];// 属于哪一个，储存开头 
int cnt[2][N][2];
inline void input(){
	scanf("%d",&n);
	ans = 0;
	scanf("%s",s[0]+1);
	scanf("%s",s[1]+1);
	scanf("%s",t[0]+1);
	scanf("%s",t[1]+1);
	for(int p = 0;p < 2;++p){
		auto &now = t[p];
		auto &b = bel[p];
		auto &c = cnt[p];
		auto &ss = s[p];
		for(int i = 1;i <= n;++i){
			c[i][0] = c[i][1] = 0;
			now[i] -= '0';
			ss[i] -= '0';
			// 处理 bel 
			if(now[i] != 1)continue;
			if(now[i-1] == 0)b[i] = i;// 开头 
			else b[i] = b[i-1];
			++c[b[i]][ss[i]];
		}
	}
}
inline void solve(){
	// 输出每个点的 bel
	// 先遍历一遍
	for(int i = 1;i <= n;++i){
		// 不考虑的部分，直接处理 
		if(!t[0][i] && !t[1][i]){
			ans += (s[0][i] == s[1][i]);
			continue;
		}
		// 调取一个过来匹配 
		if(t[0][i] && !t[1][i]){
			// 如果还有 
			if(cnt[0][bel[0][i]][s[1][i]]){
				--cnt[0][bel[0][i]][s[1][i]];
				++ans;
			}
			continue;
		}
		if(!t[0][i] && t[1][i]){
			// 如果还有 
			if(cnt[1][bel[1][i]][s[0][i]]){
				--cnt[1][bel[1][i]][s[0][i]];
				++ans;
			}
			continue;
		} 
	}
	t[0][n+1] = t[1][n+1] = 0;
	// 最后再考虑一次性花光 
	num = 0;
	for(int i = 1;i <= n;++i){
		if(!t[0][i] || !t[1][i]){
			num = 0;
			continue;
		}
		++num;
		// 如果后面就要不符合条件了就一次性全花光
		if(t[0][i+1] && t[1][i+1])continue;
		// 最多 num 个 
		auto &cnt0 = cnt[0][bel[0][i]],&cnt1 = cnt[1][bel[1][i]];
		// 先花掉 0
		tob = min(num,min(cnt0[0],cnt1[0]));
		cnt0[0] -= tob,cnt1[0] -= tob,num -= tob,ans += tob;
//		printf("i = %d,tob(0) = %d,",i,tob);
		// 再花掉 1
		tob = min(num,min(cnt0[1],cnt1[1]));
		cnt0[1] -= tob,cnt1[1] -= tob,num -= tob,ans += tob;
//		printf("tob(1) = %d\n",tob);
	}
}
inline void output(){
	printf("%d\n",ans); 
}
int main(){
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		input();
		solve();
		output();
	}
	return 0;
}
/*
1
6
011101
111010
111010
101101

*/
