#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int t,n;
string s1,s2,t1,t2;
struct node {int p,x,y;};
int main() {
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>t;
	while(t--) {
		cin>>n>>s1>>s2>>t1>>t2;s1+='0',s2+='1';
		int sum0=0,sum1=0,ans=0;
		vector<node> ve1,ve2;
		for(int i=0; i<n; i++) {
			if(t1[i]=='0') ve1.push_back((node){i,sum0,sum1}),sum0=sum1=0;
			else {
				if(s1[i]=='0') sum0++;
				else sum1++;
			}
		}
		ve1.push_back((node){n,sum0,sum1});
		sum0=0,sum1=0;
		for(int i=0; i<n; i++) {
			if(t2[i]=='0') ve2.push_back((node){i,sum0,sum1}),sum0=sum1=0;
			else {
				if(s2[i]=='0') sum0++;
				else sum1++;
			}
		}
		ve2.push_back((node){n,sum0,sum1});
		int pos1=0,pos2=0;
		while(pos1<ve1.size()&&pos2<ve2.size()) {
			bool flag=false;
			if(ve1[pos1].p>ve2[pos2].p) swap(ve1[pos1],ve2[pos2]),swap(s1[ve1[pos1].p],s2[ve1[pos1].p]),flag=true;
			if(ve1[pos1].p<ve2[pos2].p) {
				if(ve1[pos1].x>ve2[pos2].x) ans+=ve2[pos2].x,ve2[pos2].y-=(ve1[pos1].x-ve2[pos2].x),ve2[pos2].x=0;
				else ans+=ve1[pos1].x,ve2[pos2].x-=ve1[pos1].x;
				if(ve1[pos1].y>ve2[pos2].y) ans+=ve2[pos2].y,ve2[pos2].x-=(ve1[pos1].y-ve2[pos2].y),ve2[pos2].y=0;
				else ans+=ve1[pos1].y,ve2[pos2].y-=ve1[pos1].y;
				if(s1[ve1[pos1].p]=='0') {
					if(ve2[pos2].x) ve2[pos2].x--,ans++;
					else ve2[pos2].y--;
				} else {
					if(ve2[pos2].y) ve2[pos2].y--,ans++;
					else ve2[pos2].x--;
				}
			}
			if(flag) swap(s1[ve1[pos1].p],s2[ve1[pos1].p]),swap(ve1[pos1],ve2[pos2]);
			if(ve1[pos1].p==ve2[pos2].p) {
				ans+=min(ve1[pos1].x,ve2[pos2].x)+min(ve1[pos1].y,ve2[pos2].y);
				ans+=(s1[ve1[pos1].p]==s2[ve2[pos2].p]);
			}
			if(ve1[pos1].p<ve2[pos2].p) pos1++;
			else if(ve1[pos1].p>ve2[pos2].p) pos2++;
			else pos1++,pos2++;
		}
		cout<<ans<<'\n';
	}
	return 0;
}
