#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1;
typedef long long ll;
bool in(){
	char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	return ch-'0';
}
bool a[N],b[N],ta[N],tb[N];
int mpa[2],mpb[2];
int suma[N],sumb[N];
int cnta[2],cntb[2];
int cta[2],ctb[2];
int posa[2],posb[2];
int T,n,ans,fl;
void tolow(int&x,int&y){
	ans+=min(x,y);
	if(x>=y)x-=y,y=0;
	else y-=x,x=0;
	return;
}
struct nd{
	int pos,x,y;
};
vector<nd>va,vb;
int main(){
//	freopen("testdata.txt","r",stdin);
freopen("edit.in","r",stdin);
freopen("edit.out","w",stdout);
	cin>>T;
	for(int tn=1;tn<=T;++tn){
		cin>>n;
		ans=0;
		mpa[0]=mpa[1]=mpb[0]=mpb[1]=0,fl=1;
		suma[0]=sumb[0]=0,cnta[0]=cnta[1]=cntb[1]=cntb[0]=0;
		
		for(int i=1;i<=n;++i)a[i]=in(),++mpa[a[i]],suma[i]=suma[i-1]+a[i];
		for(int i=1;i<=n;++i)b[i]=in(),++mpb[b[i]],sumb[i]=sumb[i-1]+b[i];
		for(int i=1;i<=n;++i)ta[i]=in();
		for(int i=1;i<=n;++i)tb[i]=in(),fl=(ta[i]!=tb[i])?0:fl,++ctb[tb[i]],posb[tb[i]]=i;
		
		
		if(!mpa[0]||!mpa[1]){//A
			if(mpa[0])ans=mpb[0];
			else ans=mpb[1];
		}
		else if(!mpb[0]||!mpb[1]){//A
			if(mpb[0])ans=mpa[0];
			else ans=mpa[1];
		}
		else if(fl){
			for(int i=1;i<=n;++i){
				if(!ta[i]){
					if(a[i]==b[i])++ans;
					ans+=(min(cnta[1],cntb[1])+min(cntb[0],cnta[0]));
					cnta[1]=cnta[0]=cntb[1]=cntb[0]=0;
				}
				else ++cnta[a[i]],++cntb[b[i]];
			}
		}else if(cta[0]==ctb[0]&&cta[0]==1){
			if(posa[0]==posb[0]){
				for(int i=1;i<posa[0];++i)++cnta[a[i]],++cntb[b[i]];
				ans+=min(cnta[0],cntb[0])+min(cnta[1],cntb[1]);
				cnta[1]=cnta[0]=cntb[1]=cntb[0]=0;
				for(int i=posa[0]+1;i<=n;++i)++cnta[a[i]],++cntb[b[i]];
				ans+=min(cnta[0],cntb[0])+min(cnta[1],cntb[1]);
				ans+=a[posa[0]]==b[posa[0]];
			}else {
				for(int i=1;i<=n;++i)++cnta[a[i]],++cntb[b[i]];
				ans+=min(cnta[0],cntb[0])+min(cnta[1],cntb[1]);
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}
/*
1
6
011101
111010
111010
101101

*/
/*
** A:
1
8
00000000
10000111
00000000
00000000
*/
/*
** B:
1
6
011001
101111
110110
110110
*/
