#include<bits/stdc++.h>
using namespace std;
const int N=100010;
struct BIT{
	int t[N];
	void clear(){
		memset(t,0,sizeof(t));
	}
	int lowbit(int x){
		return x&-x;
	}
	void add(int k,int x){
		for(int i=k;i<N;i+=lowbit(i)) t[i]+=x;
	}
	int query(int k){
		int s=0;
		for(int i=k;i;i-=lowbit(i)) s+=t[i];
		return s;
	}
}tr[2][2];
int Q,n,ans,lc[N],rc[N],ls[N],rs[N];
char c[N],s[N],tc[N],ts[N];
void add(int o,int u,int l,int r,int x){
	tr[o][u].add(l,x),tr[o][u].add(r+1,-x);
}
int query(int o,int u,int x){
	return tr[o][u].query(x);
}
int main(){
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	scanf("%d",&Q);
	while(Q--){
		scanf("%d%s%s%s%s",&n,c+1,s+1,tc+1,ts+1);
		for(int i=0;i<=1;i++) for(int j=0;j<=1;j++) tr[i][j].clear();
		for(int l=1,r;l<=n;l=r+2){
			for(r=l;r<=n&&tc[r]=='1';r++) ;
			r--;
			for(int i=l;i<=r;i++){
				lc[i]=l,rc[i]=r;
				if(c[i]=='0') add(0,0,l,r,1);
				if(c[i]=='1') add(0,1,l,r,1);
			}
		}
		for(int l=1,r;l<=n;l=r+2){
			for(r=l;r<=n&&ts[r]=='1';r++) ;
			r--;
			for(int i=l;i<=r;i++){
				ls[i]=l,rs[i]=r;
				if(s[i]=='0') add(1,0,l,r,1);
				if(s[i]=='1') add(1,1,l,r,1);
			}
		}
		ans=0;
		for(int i=1;i<=n;i++){
			if(tc[i]=='1'&&ts[i]=='1'){
				if(query(0,1,i)&&query(1,1,i)){
					ans++;
					add(0,1,lc[i],rc[i],-1);
					add(1,1,ls[i],rs[i],-1);
				}else if(query(0,0,i)&&query(1,0,i)){
					ans++;
					add(0,0,lc[i],rc[i],-1);
					add(1,0,ls[i],rs[i],-1);
				}
			}else if(tc[i]=='0'&&ts[i]=='1'){
				if(query(1,c[i]-'0',i)){
					ans++;
					add(1,c[i]-'0',ls[i],rs[i],-1);
				}
			}else if(tc[i]=='1'&&ts[i]=='0'){
				if(query(0,s[i]-'0',i)){
					ans++;
					add(0,s[i]-'0',lc[i],rc[i],-1);
				}
			}else{
				if(c[i]==s[i]) ans++;
			}
//			printf("%d->%d\n",i,ans);
		}
		printf("%d\n",ans);
	}
	return 0;
}
