#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define str string

// 0 1 1 1 0 1 -> 1 1 0 1 0 1
// 1 1 1 0 1 0 -> 1 1 0 1 1 0
// 1 1 1 0 0 0
// 0 0 1 1 0 0
// 4
// 显然 , 两个 0 之间的值可以任意排列 
// 1  0 /1/  1  0  0 /1/ /0
// 0  1  0  /0/ 1  1  0  /1
// 1 1 0 1 1 1 0 0
// 1 1 1 0 1 1 1 0
// 4
// 当作每次 0 之间的数连续可替换，统计上次之间相同的数 
// 考虑转化思想 , 把两边的数组的判断移到一起。 
// 0 1 0 0 0 1
// 1 0 1 1 0 1
// 0 0 1 1 1 0
// 0 1 1 1 1 0

ll T,n;
str st,sr; //字符串 
str sp,sn; //判断
struct node{
	ll v;
	ll j;
};
node a[200000],b[200000];

int main()
{
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	cin>>T;
	while(T--){
		ll sumao=0,sumbo=0,sumat=0,sumbt=0;
		ll ans=0;
		cin>>n;
		cin>>st>>sr>>sp>>sn;
		for(int i=1;i<=n;i++){
			a[i].v=st[i-1]-'0';
			b[i].v=sr[i-1]-'0';
			a[i].j=sp[i-1]-'0';
			b[i].j=sn[i-1]-'0';
			if(a[i].j==0&&a[i-2].j==0) a[i-1].j=0;
			if(b[i].j==0&&b[i-2].j==0) b[i-1].j=0;
		}
		for(int i=1;i<=n;i++){
			if(a[i].j==0&&a[i].v==b[i].v) swap(a[i].j,b[i].j),swap(a[i].v,b[i].v);
		}
		for(int i=1;i<=n;i++){
			if(a[i].j==0&&b[i].j==0){
				if(a[i].v==b[i].v) ans++;
				ans+=min(sumao,sumbo)+min(sumat,sumbt);
				sumao=0,sumbo=0,sumat=0,sumbt=0;
			}
			else if(a[i].j==0&&b[i].j==1){
				if(a[i].v==1) sumao++;
				else if(a[i].v==0) sumat++;
				if(b[i].v==1) sumbo++;
				else if(b[i].v==0) sumbt++;
				ans+=min(sumao,sumbo)+min(sumat,sumbt);
				sumao=0,sumbo=0,sumat=0,sumbt=0;
			}
			else{
				if(a[i].v==1) sumao++;
				else if(a[i].v==0) sumat++;
				if(b[i].v==1) sumbo++;
				else if(b[i].v==0) sumbt++;
			}
			if(i==n&&a[i].j!=0) ans+=min(sumao,sumbo)+min(sumat,sumbt);
		}
		cout<<ans<<endl;
	}
	return 0;
}
