#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e5+5;
int n,ans;
struct Range{
int l,r,cnt0=0,cnt1=0;
};
void makeRange(const string& s,const string& t,vector<Range>& a,vector<Range>& b,array<int,N>& ind){
int l=0,cnt0=0,cnt1=0;
for(int i=0;i<n;i++){
if(t[i]=='1'){
if(s[i]=='0') ++cnt0;
else ++cnt1;
ind[i]=(int)a.size();
}
else{
ind[i]=-1;
if(i>0&&t[i-1]=='1'){
a.push_back({l,i-1,cnt0,cnt1});
l=i;
cnt0=cnt1=0;
}
b.push_back({i,i,(int)(s[i]=='0'),(int)(s[i]=='1')});
++l;
}
}
if(l<n) a.push_back({l,n-1,cnt0,cnt1});
}
void work(const vector<Range>& b,vector<Range>& oa,const vector<Range>& ob){
for(size_t i=0,j=0;i<b.size();i++){
const auto& now=b[i];
bool isZero=b[i].cnt0;
while(!(oa[j].l<=now.l&&now.r<=oa[j].r) && oa[j].l<=now.l && j<oa.size()-1) ++j;
if(oa[j].l<=now.l&&now.r<=oa[j].r){
if(isZero&&oa[j].cnt0){
--oa[j].cnt0;
++ans;
}
else if(!isZero&&oa[j].cnt1){
--oa[j].cnt1;
++ans;
}
}
}
}
string s1,s2,t1,t2;
vector<Range>a1,a2,b1,b2;
array<int,N>ind1,ind2;
void slove(){
cin>>n>>s1>>s2>>t1>>t2;
ans=0;
a1.clear();a2.clear();b1.clear();b2.clear();
for(int i=0;i<n;i++){
if(t1[i]==t2[i]&&t1[i]=='0'&&s1[i]==s2[i]) ans++;
}
makeRange(s1,t1,a1,b1,ind1);
makeRange(s2,t2,a2,b2,ind2);
work(b1,a2,b2);
work(b2,a1,b1);
for(int i=0;i<n;i++){
if(ind1[i]==-1||ind2[i]==-1) continue;
auto& x=a1[ind1[i]];
auto& y=a2[ind2[i]];
if(x.cnt0>0&&y.cnt0>0){
--x.cnt0;
--y.cnt0;
++ans;
}
else if(x.cnt1>0&&y.cnt1>0){
--x.cnt1;
--y.cnt1;
++ans;
}
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
freopen("edit.in","r",stdin);
freopen("edit.out","w",stdout);
int T;
cin>>T;
while(T--){
slove();
}
return 0;
}