
#include<cstdio>
#include<vector>
using namespace std; 
struct I_zone{
	int l,r,num;//num of 1
};

//figures would be used
bool a[100003],b[100003];
int f_a[100003],f_b[100003];
int n,t_a,t_b;
int ans;
I_zone azone[100003],bzone[100003];
void debug();

/*tools*/
int zone(const int *x,const int i);
void update(const I_zone *zn,const int t,const bool key){
	if(zn==azone){
		I_zone temp=azone[t];
		if(key){
			if(temp.num) --azone[t].num,++ans;
		}
		else if(temp.r-temp.l-temp.num) ++ans;
		f_a[temp.l]=0;
		f_a[++azone[t].l]=t;
		if(temp.l>temp.r-3) f_a[temp.r-1]=0,a[temp.r-1]=azone[t].num; 
	}
	else{
		I_zone temp=bzone[t];
		if(key){
			if(temp.num) --bzone[t].num,++ans;
		}
		else if(temp.r-temp.l-temp.num) ++ans;
		f_b[temp.l]=0;
		f_b[++bzone[t].l]=t;
		if(temp.l>temp.r-3) f_b[temp.r-1]=0,b[temp.r-1]=bzone[t].num; 
	}
}

void slove(){
	ans=1;
	//input
	scanf("%d\n",&n);
	for(int i=1;i<=n;++i) a[i]=getchar()-'0';getchar();
	for(int i=1;i<=n;++i) b[i]=getchar()-'0';getchar();
	for(int i=1;i<=n;++i) f_a[i]=getchar()-'0';getchar();
	for(int i=1;i<=n;++i) f_b[i]=getchar()-'0';getchar();
	//pre_treatment
	for(int i=1;i<=n;++i){
		
	}
	for(int i=1;i<=n;++i){//to a
		if(!f_a[i]) continue;
		int cnt=0,tmp=i;
		while(f_a[i]) if(a[i++]) ++cnt;
		if(i-tmp==1){
			f_a[tmp]=0;
			continue;
		}
		for(int j=tmp+1;j<i;++j) f_a[j]=-1;
		azone[f_a[tmp]=++t_a]={tmp,i,cnt};
	}
	for(int i=1;i<=n;++i){//to b
		if(!f_b[i]) continue;
		int cnt=0,tmp=i;
		while(f_b[i]) if(b[i++]) ++cnt;
		if(i-tmp==1){
			f_b[tmp]=0;
			continue;
		}
		for(int j=tmp+1;j<i;++j) f_b[j]=-1;
		bzone[f_b[tmp]=++t_b]={tmp,i,cnt};
	}
	//slove
	for(int i=1;i<=n;++i){
		int tmp1=zone(f_a,i),tmp2=zone(f_b,i);
		if(!tmp1){
			if(!tmp2){
				if(a[i]=b[i]) ++ans;
				continue;
			}
			update(bzone,tmp2,a[i]);
			continue;
		}
		if(!tmp2){
			update(azone,tmp2,b[i]);
			continue;
		}
		if(azone[tmp1].r<bzone[tmp2].r){
			for(i;i<azone[tmp1].r;++i){
				if(azone[tmp1].num) update(azone,tmp1,1),update(bzone,tmp2,1);
				else update(azone,tmp1,0),update(bzone,tmp2,0);
			}
		}
		else{
			for(i;i<bzone[tmp2].r;++i){
				if(bzone[tmp2].num) update(azone,tmp1,1),update(bzone,tmp2,1);
				else update(azone,tmp1,0),update(bzone,tmp2,0);
			}
		}
	}
	printf("%d\n",ans);
//	debug();
}
int main(){
//	freopen("edit.in","r",stdin);
//	freopen("edit.out","w",stdout);
	int t;
	scanf("%d",&t);
	while(t--) slove();
	return 0;
}
void debug(){
//	putchar('\n');
//	for(int i=1;i<=n;++i) printf("%d",a[i]);
//	putchar('\n');
//	for(int i=1;i<=n;++i) printf("%d",b[i]);
//	putchar('\n');
//	for(int i=1;i<=n;++i) printf("%d ",f_a[i]);
//	putchar('\n');
//	for(int i=1;i<=n;++i) printf("%d ",f_b[i]);
//	putchar('\n');
//	printf("\nA:");
//	for(int i=1;i<=t_a;++i) printf("\n    %d~%d,%dUEM",azone[i].l,azone[i].r,azone[i].num);
//	printf("\nB:");
//	for(int i=1;i<=t_b;++i) printf("\n    %d~%d,%dUEM",bzone[i].l,bzone[i].r,bzone[i].num);
//	printf("\n");
//	for(int i=1;i<=n;++i) printf("%d ",zone(f_a,i));
//	printf("\n");
//	for(int i=1;i<=n;++i) printf("%d ",zone(f_b,i));
}
int zone(const int *x,const int i){
	int j=i;
	if(x==f_a){
		if(!f_a[j]) return 0;
		else if(f_a[j]>0); 
		else while(f_a[--j]<0);
		return f_a[j];
	}
	else{
		if(!f_b[j]) return 0;
		else if(f_b[j]>0); 
		else while(f_b[--j]<0);
		return f_b[j];
	}
}


