#include<cstdio>
#include<iostream>
#include<string>
#include<ios>
using namespace std;
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
const int N=1e5+5;
int T;
int n;
string ts1,ts2,tt1,tt2;
bool s1[N],s2[N],t1[N],t2[N];
int tots,tott;
struct node{
    int l,r;
    int cnt0,cnt1;
}s[N],t[N];
int ans;
int main(){
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--){
        cin>>n;
        cin>>ts1>>tt1>>ts2>>tt2;
        for(int i=0;i<n;i++)
            s1[i]=ts1[i]-'0',t1[i]=tt1[i]-'0',s2[i]=ts2[i]-'0',t2[i]=tt2[i]-'0';
        int pre=0,cnt0=0,cnt1=0;
        for(int i=0;i<n;i++){
            if(s1[i]==0) cnt0++;
            else cnt1++;
            if(s2[i]!=s2[i+1]){
                if(s2[i]==1) s[++tots]={pre,i,cnt0,cnt1};
                pre=i+1,cnt0=cnt1=0;
            }
        }
        if(pre!=n) if(s2[n-1]==1) s[++tots]={pre,n-1,cnt0,cnt1};
        pre=cnt0=cnt1=0;
        for(int i=0;i<n;i++){
            if(t1[i]==0) cnt0++;
            else cnt1++;
            if(t2[i]!=t2[i+1]){
                if(t2[i]==1) t[++tott]={pre,i,cnt0,cnt1};
                pre=i+1,cnt0=cnt1=0;
            }
        }
        if(pre!=n) if(t2[n-1]==1) t[++tott]={pre,n-1,cnt0,cnt1};
        int ns=1,nt=1;
        for(int i=0;i<n;i++){
            if(s2[i]==1){
                if(t2[i]==0){
                    // printf("%d %d %d %d\n",i,s[ns].l,s[ns].r,s[ns].l<=i&&i<=s[ns].r);
                    if(t1[i]==0){
                        if(s[ns].cnt0 > 0) s[ns].cnt0--,ans++;
                    }else{
                        if(s[ns].cnt1 > 0) s[ns].cnt1--,ans++;
                    }
                }else if(i==t[nt].r) nt++; 
                if(i==s[ns].r) ns++;
                continue;
            }
            if(t2[i]==0){
                if(t1[i]==s1[i]) ans++;
            }else{
                // printf("%d %d %d %d\n",i,t[nt].l,t[nt].r,t[nt].l<=i&&i<=t[nt].r);
                if(s1[i]==0){
                    if(t[nt].cnt0 > 0) t[nt].cnt0--,ans++;
                }else{
                    if(t[nt].cnt1 > 0) t[nt].cnt1--,ans++;
                }
                if(i==t[nt].r) nt++;
            }    
        }
        ns=nt=1;
        while(ns<=tots&&nt<=tott){
            while(ns<=tots && s[ns].r < t[nt].l) ns++;
            if(ns>tots) break;
            while(nt<=tott && t[nt].r < s[ns].l) nt++;
            if(nt>tott) break;
            if(t[nt].l<=s[ns].r){
                int len = t[nt].r-s[ns].l+1;
                if(t[nt].r>s[ns].r) len-=(t[nt].r-s[ns].r);
                if(t[nt].l>s[ns].l) len-=(t[nt].l-s[ns].l);
                int minn = min(len,min(t[nt].cnt0,s[ns].cnt0));
                ans=ans+minn;
                t[nt].cnt0-=minn,s[ns].cnt0-=minn,len-=minn;
                minn = min(len,min(t[nt].cnt1,s[ns].cnt1));
                ans=ans+minn;
                t[nt].cnt1-=minn,s[ns].cnt1-=minn;
            }
            if(s[ns].l<=t[nt].l&&s[ns].r>=t[nt].r) nt++;
            else if(s[ns].l>=t[nt].l&&s[ns].r<=t[nt].r) ns++;
            else if(s[ns].l<=t[nt].l) ns++;
            else nt++;
        }
        printf("%d\n",ans);
        tots=tott=ans=0;
    }
	return 0;
}
