#include<bits/stdc++.h>
using namespace std;
namespace SOLUTION{
const int maxn=1e5+5;
char str[maxn],str2[maxn],tex[maxn],tex2[maxn];
class segment{
public:
int l,r,cnt0,cnt1;
segment(int l,int r,int cnt0,int cnt1):l(l),r(r),cnt0(cnt0),cnt1(cnt1) {}
segment() {}
};
segment seg[2][maxn];
int cnt[2];
inline int Main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
cin>>str>>str2>>tex>>tex2;
for(int i=n;i;--i){
str[i]=str[i-1];
str2[i]=str2[i-1];
tex[i]=tex[i-1];
tex2[i]=tex2[i-1];
}
cnt[0]=cnt[1]=0;
int last=0,cnt0=0,cnt1=0;
for(int i=1;i<=n;++i){
if(tex[i]=='0'){
if(last!=i-1){
seg[0][++cnt[0]]=segment(last+1,i-1,cnt0,cnt1);
}
seg[0][++cnt[0]]=segment(i,i,(str[i]=='0'),(str[i]=='1'));
cnt0=cnt1=0;
last=i;
}
else{
cnt0+=(str[i]=='0');
cnt1+=(str[i]=='1');
}
}
if(last!=n){
seg[0][++cnt[0]]=segment(last+1,n,cnt0,cnt1);
}
last=0,cnt0=0,cnt1=0;
for(int i=1;i<=n;++i){
if(tex2[i]=='0'){
if(last!=i-1){
seg[1][++cnt[1]]=segment(last+1,i-1,cnt0,cnt1);
}
seg[1][++cnt[1]]=segment(i,i,(str2[i]=='0'),(str2[i]=='1'));
cnt0=cnt1=0;
last=i;
}
else{
cnt0+=(str2[i]=='0');
cnt1+=(str2[i]=='1');
}
}
if(last!=n){
seg[1][++cnt[1]]=segment(last+1,n,cnt0,cnt1);
}
int ans=0,it=1;
for(int i=1;i<=cnt[0];++i){
while(it<=cnt[1]){
if(seg[1][it].l>seg[0][i].r){
break;
}
if(seg[1][it].r<seg[0][i].l){
++it;
continue;
}
int a=min(seg[0][i].cnt0,seg[1][it].cnt0),b=min(seg[0][i].cnt1,seg[1][it].cnt1);
ans+=a+b;
seg[0][i].cnt0-=a,seg[1][it].cnt0-=a;
seg[0][i].cnt1-=b,seg[1][it].cnt1-=b;
if(seg[1][it].r<=seg[0][i].r){
if(seg[1][it].cnt0){
seg[0][i].cnt1-=seg[1][it].cnt0;
}
if(seg[1][it].cnt1){
seg[0][i].cnt0-=seg[1][it].cnt1;
}
++it;
}
else{
if(seg[0][i].cnt0){
seg[1][it].cnt1-=seg[0][i].cnt0;
}
if(seg[0][i].cnt1){
seg[1][it].cnt0-=seg[0][i].cnt1;
}
break;
}
}
}
cout<<ans<<"\n";
}
return 0;
}
}
int main(){
freopen("edit.in","r",stdin);
freopen("edit.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
SOLUTION::Main();
return 0;
}