// A edit 
#include<bits/stdc++.h>

using namespace std;
typedef pair<int,int>pii;
typedef long long ll;
const int N=1e5+1000;
int T,n;
struct qj{
	int l,r,cntzero,cntone;
};
string t,p;
string st,sp;
vector<qj>tt;
vector<qj>pp;
int cnttz,cntpz,cntto,cntpo,cnto,cntz;
int tr,tl,pl,pr,ans;
int idt[N],idp[N];

void solve(){
	ans=0;
	tt.clear(),pp.clear();
	pl=0,pr=0,tr=0,tl=0;
	cnttz=0,cntto=0,cntpz=0,cntpo=0,cnto=0,cntz=0;
	memset(idt,-1,sizeof idt);
	memset(idp,-1,sizeof idp);	
	
	cin>>n>>t>>p>>st>>sp;
	
	for(int i=0;i<n;i++){
		if(st[i]=='1'){
			if((i&&st[i-1]=='1')||(i<n-1&&st[i+1]=='1'))st[i]='1';
			else st[i]='0';
		}
		if(sp[i]=='1'){
			if((i&&sp[i-1]=='1')||(i<n-1&&sp[i+1]=='1'))sp[i]='1';
			else sp[i]='0';
		}
	}
	bool fgt=false,fgp=false;
	for(int i=0;i<n;i++){
		if(st[i]=='1'){
			fgt=true;
			tr=i;
			if(t[i]=='0')cnttz++;
			else cntto++;
			idt[i]=tt.size();
			if(i==n-1)tt.emplace_back((qj){tl,tr,cnttz,cntto});
		}
		else{
			if(fgt)tt.emplace_back((qj){tl,tr,cnttz,cntto});
			cnttz=0,cntto=0;
			fgt=false;
			tl=i+1,tr=i+1;
		}
		
		if(sp[i]=='1'){
			fgp=true;
			pr=i;
			if(p[i]=='0')cntpz++;
			else cntpo++;
			idp[i]=pp.size();
			if(i==n-1)pp.emplace_back((qj){pl,pr,cntpz,cntpo});
		}
		else{
			if(fgp)pp.emplace_back((qj){pl,pr,cntpz,cntpo});
			cntpz=0,cntpo=0;
			fgp=false;
			pl=i+1,pr=i+1;
		}
	}
	if(tt.size()){
		for(int i=0;i<tt[0].l;i++){
			if(idp[i]==-1){
				if(t[i]==p[i])ans++;
			}
			else{
				if(t[i]=='0'){
					if(pp[idp[i]].cntzero)ans++,pp[idp[i]].cntzero--;
					else pp[idp[i]].cntone--;
				}
				else{
					if(pp[idp[i]].cntone)ans++,pp[idp[i]].cntone--;
					else pp[idp[i]].cntzero--; 
				}
			}
		}
	}
	else {
		for(int i=0;i<n;i++){
			if(idp[i]==-1){
				if(t[i]==p[i])ans++;
			}
			else{
				if(t[i]=='0'){
					if(pp[idp[i]].cntzero)ans++,pp[idp[i]].cntzero--;
					else pp[idp[i]].cntone--;
				}
				else {
					if(pp[idp[i]].cntone)ans++,pp[idp[i]].cntone--;
					else pp[idp[i]].cntzero--;
				}
			}
		}
	}
	for(int j=0,i=0;i<tt.size();++i){
		j=tt[i].l;
		for(;j<=tt[i].r;++j){
			if(idp[j]==-1){
				if(p[j]=='0'){
					if(tt[i].cntzero)ans++,tt[i].cntzero--;
					else tt[i].cntone--;
				}
				else{
					if(tt[i].cntone)ans++,tt[i].cntone--;
					else tt[i].cntzero--;
				}
			}
			else{
				int tmp=idp[j],len=0;
				if(pp[tmp].r<=tt[i].r){
					len=pp[tmp].r-j+1;
					cntz=min(pp[tmp].cntzero,tt[i].cntzero);
					ans+=cntz;
					cnto=min(pp[tmp].cntone,tt[i].cntone);
					ans+=cnto;
					tt[i].cntone-=cnto;
					pp[tmp].cntone-=cnto;
					tt[i].cntzero-=cntz;
					pp[tmp].cntzero-=cntz;
					
					if(cntz+cnto<len){
						int mis=len-cntz-cnto;
						if(tt[i].cntone)tt[i].cntone-=mis;
						else tt[i].cntzero-=mis;
					}
					
					j=pp[tmp].r;
				}
				else{
					len=tt[i].r-j+1;
					cntz=min(pp[tmp].cntzero,tt[i].cntzero);
					cnto=min(pp[tmp].cntone,tt[i].cntone);
					ans+=cntz+cnto;
					tt[i].cntzero-=cntz;
					tt[i].cntone-=cnto;
					pp[tmp].cntzero-=cntz;
					pp[tmp].cntone-=cnto;
					if(cntz+cnto<len){
						int mis=len-cntz-cnto;
						if(pp[tmp].cntone)pp[tmp].cntone-=mis;
						else pp[tmp].cntzero-=mis;
					}
					break;
				}
			}
		}
		int nxt=n-1;
		if(i+1<tt.size())
			nxt=tt[i+1].l-1;
		for(int j=tt[i].r+1;j<=nxt;j++){
			if(idp[j]==-1){
				if(p[j]==t[j])ans++;
			}
			else{
				int tmp=idp[j];
				if(t[j]=='0'){
					if(pp[tmp].cntzero)ans++,pp[tmp].cntzero--;
					else pp[tmp].cntone--;
				}
				else{
					if(pp[tmp].cntone)ans++,pp[tmp].cntone--;
					else pp[tmp].cntzero--;
				}
			}
		}
	}
	cout<<ans<<'\n';
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

