#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define L(i,l,r) for(int i=l;i<=r;i++)
#define R(i,r,l) for(int i=r;i>=l;i--)

const int N=1e5+10;

int n;
char a[N],b[N],ca[N],cb[N];
bool va[N],vb[N];
struct Node{
	int l,r,cnt;
	int one,zero;
	bool operator<(const Node &b)const{
		return l<b.l;
	}
};
vector<Node> A,B;
void setup(){
	A.clear(); B.clear(); 
	memset(va,0,sizeof va);
	memset(vb,0,sizeof vb); 
	int lst=0,lstl=-1;
	ca[n+1]=cb[n+1]='$';
	 
	L(i,1,n+1){
		if(ca[i]=='1'){
			if(!lst) lstl=i;
			lst++;
		}else{
			if(lst){
				lst=0;
				if(i-lstl>=2) A.push_back((Node){lstl,i-1,i-lstl,0,0});
				lstl=-1; 
			}
		}
	}
	lst=0; lstl=-1;
	L(i,1,n+1){
		if(cb[i]=='1'){
			if(!lst) lstl=i;
			lst++;	
		}else{
			if(lst){
				lst=0;
				if(i-lstl>=2) B.push_back((Node){lstl,i-1,i-lstl,0,0});
				lstl=-1;
			}
		}
	}
	
	for(auto &x:A){
		int tone=0,tzero=0;
		L(i,x.l,x.r){
			if(a[i]=='1') tone++;
			else tzero++;
			va[i]=1;
		}
		x.one=tone;
		x.zero=tzero;
	}
	for(auto &x:B){
		int tone=0,tzero=0;
		L(i,x.l,x.r){
			if(b[i]=='1') tone++;
			else tzero++;
			vb[i]=1;
		}
		x.one=tone;
		x.zero=tzero;
	}
	sort(A.begin(),A.end());
	sort(B.begin(),B.end());
} 
void solve(){
	cin>>n>>a+1>>b+1>>ca+1>>cb+1;
	setup();
//	for(auto x:A){
//		cerr<<x.l<<' '<<x.r<<' '<<x.one<<' '<<x.zero<<'\n';
//	}cerr<<'\n';
//	for(auto x:B){
//		cerr<<x.l<<' '<<x.r<<' '<<x.one<<' '<<x.zero<<'\n';
//	}
//	cerr<<"\n\n";
	int ans=0;
	int cur=0,tone=0,tzero=0;
	L(i,1,n){
		if(!va[i]&&!vb[i]){
			if(ca[i]==cb[i]){
				ans++;
			}
		}
	}
	for(auto x:A){
		int zero=x.zero,one=x.one;
//		cerr<<x.l<<' '<<x.r<<' '<<zero<<' '<<one<<'\n';
		int i;
		for(i=x.l;i<=x.r;){
			if(!vb[i]){
				if(b[i]=='1'){
					if(one){
//						cerr<<i<<' ';
						ans++;
						one--;
//						cerr<<one<<'\n';
					}else{
						zero--;
					}
				}else{
					if(zero){
						ans++;
						zero--;
					}else{
						one--;
					}
				}
				i++;
			}else{
//				cerr<<zero<<' '<<one<<'\n';
				if(zero){
//					cerr<<B[cur].zero<<'\n';
					if(B[cur].zero>=zero){
						ans+=zero;
						B[cur].zero-=zero;
						zero=0;
					}else{
						ans+=B[cur].zero;
						zero-=B[cur].zero;
						B[cur].zero=0;	
					}
				}
				if(one){
					if(B[cur].one>=one){
//						cerr<<i<<' ';
						ans+=one;
						B[cur].one-=one;
						one=0;
//						cerr<<B[cur].one<<'\n';
					}else{
						ans+=B[cur].one;
						one-=B[cur].one;
						B[cur].one=0;
					}
				} 
//				cerr<<B[cur].one<<' '<<B[cur].zero<<'\n';
//				cerr<<min(B[cur].cnt,x.r-i+1)<<'\n';
				i+=min(B[cur].cnt,x.r-i+1);
				cur++;
			}
		}
//		cerr<<i<<'\n';
	}
//	for(auto x:B){
//		cerr<<x.l<<' '<<x.r<<' '<<x.one<<' '<<x.zero<<'\n';
//	}
//	cerr<<"\n\n";
//	cerr<<ans<<'\n';
	for(auto x:B){
//		cerr<<x.l<<' '<<x.r<<' '<<x.one<<' '<<x.zero<<'\n';
		int zero=x.zero,one=x.one;
		for(int i=x.l;i<=x.r;i++){
			if(!va[i]){
				if(a[i]=='1'){
					if(one){
//						cerr<<i<<'\n';
						ans++;
						one--;			
					}else{
						zero--;
					}
				}else{
					if(zero){
						ans++;
						zero--;
					}else{
						one--;
					}
				}
			}
		}
	}
	cout<<ans<<'\n';
}
signed main(){
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T; cin>>T; 
	while(T--) solve();
	return 0;
}
/*
1
10
0110111100
1111111100
1110000100
0110111011
*/
