#include<bits/stdc++.h>
using namespace std;
int t,n,ans=0,res1[100005],res2[100005],cnta1,cnta0,cntb1,cntb0,lockera1,lockerb1,lockera0,lockerb0;
string a,b,c,d;
vector<int>v1,v2;
bool flag,flag2;
struct node{
	int l,r,len,cnt1,Paco;
}lo[100005],lt[100005];
void init()
{
	v1.clear();
	v2.clear();
	memset(res1,0,sizeof(res1));
	memset(res2,0,sizeof(res2));
	flag=1,flag2=1;
	ans=0;
}
bool dudek()
{
	for(int i=2;i<=n;i++)
		if(a[i]!=a[i-1])
			return 0;
	return 1;
}
bool kvardek()
{
	bool flag=1;
	for(int i=1;i<=n;i++)
	{
		if(c[i]!=d[i])flag=0;
		if(c[i]=='0')v1.push_back(i);
		if(d[i]=='0')v2.push_back(i);
		res1[i]=res1[i-1]+a[i]-'0';
		res2[i]=res2[i-1]+b[i]-'0';
	}
	return flag;
}
void perfecto()
{
	int l=1,r=1,co1=0,co2=0;
	ans=n;
	for(int i=1;i<=n;i++)
	{
		if(c[i]=='0')
		{
			//cout<<"e"<<endl;
			lo[++co1].l=l,lo[co1].r=i,lo[co1].len=i-l+1,lo[co1].cnt1=res1[i]-res1[l-1],lo[co1].Paco=a[i]-'0';
			l=i+1;
		}
		if(d[i]=='0')
		{
			//cout<<"f"<<endl;
			lt[++co2].l=r,lt[co2].r=i,lt[co2].len=i-r+1,lt[co2].cnt1=res2[i]-res2[r-1],lt[co2].Paco=b[i]-'0';
			r=i+1;
		}
	}
	if(l<=n)lo[++co1].l=l,lo[co1].r=n,lo[co1].len=n-l+1,lo[co1].cnt1=res1[n]-res1[l-1];
	if(r<=n)lt[++co2].l=r,lt[co2].r=n,lt[co2].len=n-r+1,lt[co2].cnt1=res2[n]-res2[r-1];
	//cout<<co1<<' '<<co2<<endl;
	for(int i=1,j=1;i<=co1,j<=co2;)
	{
		//cout<<i<<' '<<j<<endl; 
		//cout<<lo[i].l<<' '<<lo[i].r<<' '<<lt[j].l<<' '<<lt[j].r<<' '<<ans<<' '<<lo[i].cnt1<<' '<<lt[j].cnt1<<endl;
		if(lo[i].r==lt[j].r)
		{
			if(a[lo[i].r]==b[lt[j].r])
			{
				ans-=abs(lo[i].cnt1-lt[j].cnt1);
				i++,j++;
			}
			else
			{
				if(a[lo[i].r]=='1')lo[i].cnt1--;
				else lt[j].cnt1--;
				ans--;
				ans-=abs(lo[i].cnt1-lt[j].cnt1);
				i++,j++;
			}
		}//长度一样，正常操作 
		else if(lo[i].r<lt[j].r)
		{
			lt[j].cnt1-=lt[j].Paco;
			//cout<<lt[j].len<<' '<<lt[j].cnt1<<endl;
			if(lt[j].cnt1>=lo[i].cnt1 and lt[j].len-lt[j].cnt1>=lo[i].len-lo[i].cnt1)
			{
				//cout<<"f"<<endl;
				 lt[j].cnt1-=lo[i].cnt1;
			}//可以完全满足 
			else
			{
				if(lt[j].cnt1>=lo[i].cnt1)//可以满足1 
				{
					ans-=abs(lo[i].len-lo[i].cnt1-(lt[j].len-lt[j].cnt1));
					lt[j].cnt1-=(lo[i].len-(lt[j].len-lt[j].cnt1));
				}
				else if(lt[j].len-lt[j].cnt1>=lo[i].len-lo[i].cnt1)//可以满足0 
				{
					ans-=abs(lo[i].cnt1-lt[j].cnt1);
					lt[j].cnt1=0;
				}
			}
			lt[j].l=lo[i].r+1, lt[j].len=lt[j].r-lt[j].l+1, lt[j].cnt1+=lt[j].Paco;
			i++;
		}
		else
		{
			lo[i].cnt1-=lo[i].Paco;
			if(lo[i].cnt1>=lt[j].cnt1 and lo[i].len-lo[i].cnt1>=lt[j].len-lt[j].cnt1)
			{
				//cout<<"f"<<endl;
				 lo[i].cnt1-=lt[j].cnt1;
			}//可以完全满足 
			else
			{
				if(lo[i].cnt1>=lt[j].cnt1)//可以满足1 
				{
					ans-=abs(lo[i].len-lo[i].cnt1-(lt[j].len-lt[j].cnt1));
					lo[i].cnt1-=(lt[j].len-(lo[i].len-lo[i].cnt1));
				}
				else if(lo[i].len-lo[i].cnt1>=lt[j].len-lt[j].cnt1)//可以满足0 
				{
					ans-=abs(lo[i].cnt1-lt[j].cnt1);
					lo[i].cnt1=0;
				}
			}
			lo[i].l=lt[j].r+1, lo[i].len=lo[i].r-lo[i].l+1, lo[i].cnt1+=lo[i].Paco;
			j++;
		}
		//cout<<ans<<endl;
	}
	cout<<ans<<endl;
}
int main()
{
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	cin>>t;
	while(t--)
	{	
		init();
		cin>>n>>a>>b>>c>>d;
		a=' '+a,b=' '+b,c=' '+c,d=' '+d;
		if(dudek())
		{
			for(int i=1;i<=n;i++)
				if(b[i]==a[i])ans++;
			cout<<ans<<endl;
			continue;
		}
		if(kvardek())
		{
			ans=n;
			for(int i=0;i<v1.size();i++)
			{
				if(a[v1[i]]==b[v2[i]])
				{
					if(i==0)ans-=abs(res1[v1[0]]-res2[v2[0]]);
					else ans-=abs(res1[v1[i]]-res1[v1[i-1]]-res2[v2[i]]+res2[v2[i-1]]);
				}
				else
				{
					if(i==0 and v1[i]==0)ans--;
					else
					{
						if(i==0)ans-=abs(res1[v1[0]-1]-res2[v2[0]-1]);
						else ans-=abs(res1[v1[i]-1]-res1[v1[i-1]]-res2[v2[i]-1]+res2[v2[i-1]]);
						ans--;
					}
				}
			}
			cout<<ans<<endl;
			continue;
		}
		perfecto();
	}
	return 0;
}
