#include<bits/stdc++.h>
using namespace std;

/*
想不到结论，应该有问题，先打 T2 

那还是回头来做这个，还是考虑贪心做法： 
暴力？也许可以 

如果已经匹配了，那么可以直接跳过，因为如果能调换顺序，一定能无伤换过去，也就是只改变 i,j 顺序就行。那么这个不会影响到已经匹配了的位点 
那么开始考虑全都没有匹配的情况了： 
既然全都没有匹配，其实有 s1 就能推出来 s2，其中，如果 s1 有不一样的两个点，且可以直接换，那是必然换过去的，换过去之后直接删掉就好了 
然后 s1 已经没有可以只用 s1 就过去的了，此时 s1 再怎么换也不会有什么不一样，所以考虑 s2 能不能做贡献 

怎么找不一样的两个点且能相互到达呢？直接 O(n) 跑一遍？ 

??? t1 == t2 应该没有 s2 的判断才对啊？
怎么跑了 s2 的判断，甚至还少了这么多   

好废了，样例 1 也过不了了 

样例 1 居然不是贪心的做法？
考虑 dp：

考虑不出来了 

其实最关键的应该是那个 23 交替的点位，它可以作为一个交接点来做多一个贡献  

luogu uid:831702
退役啦！ 
*/

const int maxn=1e5+10;
int T;
int n;
string s1,s2,t1,t2;
int ans;
int id[3][3];
//int dp[maxn][3];

int main()
{
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	scanf("%d",&T);
	while(T--)
	{
		id[1][0]=id[1][1]=id[2][0]=id[2][1]=-1;
		ans=0;
		scanf("%d",&n);
		cin>>s1>>s2>>t1>>t2;
		for(int i=0;i<n;i++)
		{
			if(s1[i]==s2[i])
				ans++;
		}
		for(int i=0;i<n;i++)
		{
			if(t1[i]=='0')
			{
				id[1][0]=id[1][1]=-1;
				continue;
			}
			if(s1[i]=='1'&&s2[i]=='0')
				id[1][1]=i;
			if(s1[i]=='0'&&s2[i]=='1')
				id[1][0]=i;
			if(id[1][1]!=-1&&id[1][0]!=-1)
			{
				ans+=2;
				swap(s1[id[1][1]],s1[id[1][0]]);
				id[1][1]=id[1][0]=-1;
			}
		}
		for(int i=0;i<n;i++)
		{
			if(t2[i]=='0')
			{
				id[2][1]=id[2][0]=-1;
				continue;
			}
			if(s2[i]=='1'&&s1[i]=='0')
				id[2][1]=i;
			if(s2[i]=='0'&&s1[i]=='1')
				id[2][0]=i;
			if(id[2][0]!=-1&&id[2][1]!=-1)
			{
				ans+=2;
				swap(s2[id[2][1]],s2[id[2][0]]);
				id[2][0]=id[2][1]=-1;
			}
		}
		cout<<ans<<'\n';
	}
	return 0;
}
