#include<bits/stdc++.h>
using namespace std;
/*
记得清空 
这两个字符串需要贪心处理
如果一个联通块包含另一个连通块，那么可以匹配的就去匹配
就是统计其中相交的情况
相当于用二分图把他们连起来了
需要统计的是：当判断到哪一个连通块到顶的时候，看看与其相交的另一个连通块是否有符合的，有就给，没有就不给
可以用桶存下
也就是说有需求和不需求的
当我在连通块里面移动的时候是有需求的，需要互相满足的
如果脱离这个联通块就不需要了 
可以尝试一下双指针
双指针可以先扫描s1的连通块，然后再扫描s2连通块，每一次扫描都要求要超过对方的连通块，这样保证了肯定能赋值
对于包含的直接把小的看成普通的对待即可

尝试为每个区间维护r，表示这个连续区间的向右最远距离
首先两个双指针同步，假设有区间的位置为s1
如果没有遇到s2的r大于自己的，那么就直接扫，到最后统计一下贡献
先预处理出每一个大段的两个数字个数
然后继续扫？
这样相交的时候就可以匹配了，直接把1和0的个数减去，然后清空那个不是联通块的 
*/

const int N=1e5+5;
int T,n;
string s1,s2; 
string pd1,pd2; 
int ans,r1[N],r2[N],t1[N][3],t2[N][3];
void csh(){
	for(int i=0;i<n;i++){
		r1[i]=r2[i]=t1[i][1]=t1[i][0]=t2[i][1]=t2[i][0]=0;
	}
	ans=0;//多测记得清空 
}
int ask(char x){return x-'0';}
int main(){
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--){
		cin>>n>>s1>>s2>>pd1>>pd2;
		csh();
		int q1=0,q2=0,nw1=n-1,nw2=n-1;
		for(int i=n-1;i>=0;i--){
			if(ask(pd1[i])) r1[i]=nw1;
			else r1[i]=i,nw1=i-1;
			if(ask(pd2[i])) r2[i]=nw2;
			else r2[i]=i,nw2=i-1;
		} 
		for(int i=0;i<n;i=r1[i]+1){
			for(int j=i;j<=r1[i];j++) t1[i][ask(s1[j])]++;
		}
		for(int i=0;i<n;i=r2[i]+1){
			for(int j=i;j<=r2[i];j++) t2[i][ask(s2[j])]++;
		}
		for(int i=0;i<n;i=r1[i]+1){
			for(int j=i;j<=r1[i];j++){
				if(r2[j]>r1[i]) break;
				int x=min(t1[i][0],t2[j][0]);
				ans+=x,t1[i][0]-=x,t2[j][0]-=x;
				x=min(t1[i][1],t2[j][1]);
				ans+=x,t1[i][1]-=x,t2[j][1]-=x;	
			}
		}
		for(int i=0;i<n;i=r2[i]+1){
			for(int j=i;j<=r2[i];j++){
				if(r1[j]>r2[i]) break;
				int x=min(t2[i][0],t1[j][0]);
				ans+=x,t2[i][0]-=x,t1[j][0]-=x;
				x=min(t2[i][1],t1[j][1]);
				ans+=x,t2[i][1]-=x,t1[j][1]-=x;
			}
		}
		q1=0,q2=0;
		r1[n]=n,r2[n]=n;
		while(q1<n){
			while(r1[q1]==q1&&q1<n){q1++;}
			q2=q1+1;
			while(r2[q2]<=r1[q1]&&q2<=r1[q1]&&q2<n){q2++;}
			if(r2[q2]>r1[q1]&&q2<=r1[q1]){
				int se=r1[q1]-q2+1;
				int x=min(t1[q1][0],min(t2[q2][0],se));
				t1[q1][0]-=x,t2[q2][0]-=x,se-=x,ans+=x;
				x=min(t1[q1][1],min(t2[q2][1],se));
				t1[q1][1]-=x,t2[q2][1]-=x,se-=x,ans+=x;
			}
			q1=r1[q1]+1;
		}
		q1=0,q2=0;
		while(q2<n){
			while(r2[q2]==q2&&q2<n){q2++;}
			q1=q2+1;
			while(r1[q1]<=r2[q2]&&q1<=r2[q2]&&q1<n){q1++;}
			if(r1[q1]>r2[q2]&&q1<=r2[q2]){
				int se=r2[q2]-q1+1;
				int x=min(t2[q2][0],min(t1[q1][0],se));
				t2[q2][0]-=x,t1[q1][0]-=x,se-=x,ans+=x;
				x=min(t2[q2][1],min(t1[q1][1],se));
				t2[q2][1]-=x,t1[q1][1]-=x,se-=x,ans+=x;
			}
			q2=r2[q2]+1;
		}
		cout<<ans<<"\n";
	}
	return 0;
}
