#include<bits/stdc++.h>
using namespace std;
int T,len;
char lenc[6],lenT[3];
char tmp[100005];
char sa[100005],sb[100005];
char ta[100005],tb[100005];
int pcnta,pcntb;//下一行的计数器 
int cnta[100005],cntb[100005];//统计包含每个block的点的左区间共有多少个1 
int blk_ta[100005],blk_tb[100005];//记录ta和tb中不能移动的元素的下标 
int idxa,idxb,blka,blkb;//idx:记录合法字符串个数 blk:记录被锁元素的个数 
struct charstr{
	char s[15];//只有n<=10时才用得上 
} stra[3628805],strb[3628805];
bool useda[100005],usedb[100005];
void lenc2len(){
	int l=strlen(lenc);
	int num=0;
	for(int i=0;i<l;i++) num*=10,num+=(lenc[i]-'0');
	len=num;
}
void lent2t(){
	int l=strlen(lenT);
	int num=0;
	for(int i=0;i<l;i++) num*=10,num+=(lenT[i]-'0');
	T=num;
}
void dfsa(int p){
	if(p==len){
		bool flag=true;
		for(int i=0;i<blka;i++){
			if(tmp[blk_ta[i]]!=sa[blk_ta[i]]){
				flag=false;
				break;
			}
		}
		int tmpcnt=0,ptmpcnt=0;
		for(int i=0;i<p;i++){
			if(ta[i]=='1') if(tmp[i]=='1') tmpcnt++;
			if(ta[i]=='0'){
				if(tmp[i]=='1') tmpcnt++;
				if(tmpcnt!=cnta[ptmpcnt]){
					flag=false;
					break;
				}
				tmpcnt=0,ptmpcnt++;
			}
		}
		if(flag) memcpy(stra[idxa++].s,tmp,p);
		//printf("tmpa:%s\n",stra[idxa-1].s);
		return;
	}
	for(int i=0;i<len;i++){
		if(!useda[i]){
			useda[i]=true;
			tmp[p]=sa[i];
			dfsa(p+1);
			useda[i]=false;
		}
	}
}
void dfsb(int p){
	if(p==len){
		bool flag=true;
		for(int i=0;i<blkb;i++){
			if(tmp[blk_tb[i]]!=sb[blk_tb[i]]){
				flag=false;
				break;
			}
		}
		int tmpcnt=0,ptmpcnt=0;
		for(int i=0;i<p;i++){
			if(tb[i]=='1') if(tmp[i]=='1') tmpcnt++;
			if(tb[i]=='0'){
				if(tmp[i]=='1') tmpcnt++;
				if(tmpcnt!=cntb[ptmpcnt]){
					flag=false;
					break;
				}
				tmpcnt=0,ptmpcnt++;
			}
		}
		if(flag) memcpy(strb[idxb++].s,tmp,p);
		return;
	}
	for(int i=0;i<len;i++){
		if(!usedb[i]){
			usedb[i]=true;
			tmp[p]=sb[i];
			dfsb(p+1);
			usedb[i]=false;
		}
	}
}
int getsame(int a,int b){
	int cnt=0;
	for(int i=0;i<len;i++){
		if(stra[a].s[i]==strb[b].s[i]) cnt++;
	}
	
	if(cnt==6){
		printf("stra:%s\n",stra[a].s);
		printf("strb:%s\n",strb[b].s);
		printf("cnt:%d\n",cnt);
	}
	
	return cnt;
}
int main(){
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	
	gets(lenT);
	lent2t();
	while(T--){
		idxa=0,idxb=0;
		blka=0,blkb=0;
		pcnta=0,pcntb=0;
		memset(sa,0,sizeof(sa));
		memset(sb,0,sizeof(sb));
		memset(ta,0,sizeof(ta));
		memset(tb,0,sizeof(tb));
		memset(tmp,0,sizeof(tmp));
		memset(cnta,0,sizeof(cnta));
		memset(cntb,0,sizeof(cntb));
		memset(useda,0,sizeof(useda));
		memset(usedb,0,sizeof(usedb));
		memset(blk_ta,0,sizeof(blk_ta));
		memset(blk_tb,0,sizeof(blk_tb));
		
		gets(lenc);
		lenc2len();
		gets(sa);
		gets(sb);
		gets(ta);
		gets(tb);
		bool flagA=true;
		bool flagB=true;
		bool flagC=true;
		int tacnt=0,tbcnt=0;
		char saF=sa[0];
		for(int i=0;i<len;i++) if(ta[i]=='0') blk_ta[blka++]=i;
		for(int i=0;i<len;i++) if(tb[i]=='0') blk_tb[blkb++]=i;
		for(int i=0;i<len;i++){
			if(saF!=sa[i]) flagA=false;
			if(ta[i]=='0') tacnt++;
			if(ta[i]=='1') if(sa[i]=='1') cnta[pcnta]++;
			if(ta[i]=='0'){
				if(sa[i]=='1') cnta[pcnta]++;
				pcnta++;
			}
		}
		for(int i=0;i<len;i++){
			if(tb[i]!=ta[i]) flagB=false;
			if(tb[i]=='0') tbcnt++;
			if(tb[i]=='1') if(sb[i]=='1') cntb[pcntb]++;
			if(tb[i]=='0'){
				if(sb[i]=='1') cntb[pcntb]++;
				pcntb++;
			}
		}
		if(!(tacnt==1 && tbcnt==1)) flagC=false;
		if(flagA){//性质A:s1所有元素都相同 
			//printf("A\n");
			int cnt=0;
			for(int i=0;i<len;i++){
				if(sb[i]==sa[i]) cnt++;
			} 
			printf("%d\n",cnt);
			continue;
		}
		if(flagB){//性质B:t1和t2相同 
			//printf("B\n");
			int cnt=0;
			int cnttmpa=0,cnttmpb=0;//记录在非锁定格子中1的个数
			int cnttmpaa=0,cnttmpbb=0;//记录在非锁定格子中0的个数 
			for(int i=0;i<len;i++){
				if(ta[i]=='1'){
					if(sa[i]=='1') cnttmpa++;
					if(sb[i]=='1') cnttmpb++;
					if(sa[i]=='0') cnttmpaa++;
					if(sb[i]=='0') cnttmpbb++; 
				}
				if(ta[i]=='0'){
					cnt+=min(cnttmpa,cnttmpb);
					cnt+=min(cnttmpaa,cnttmpbb);
					if(sa[i]==sb[i]) cnt++;
					//printf("cnt:%d %c %c\n",cnt,sa[i],sb[i]);
					cnttmpa=0,cnttmpb=0;
					cnttmpaa=0,cnttmpbb=0;
				}
			}
			cnt+=min(cnttmpa,cnttmpb);
			cnt+=min(cnttmpaa,cnttmpbb);
			printf("%d\n",cnt);
			continue;
		}
		if(flagC){
			//printf("C\n");
			int cnt=0;
			int blkA,blkB;
			for(int i=0;i<len;i++){blkA=i;if(ta[i]=='0'){break;}}
			for(int i=0;i<len;i++){blkB=i;if(tb[i]=='0'){break;}}
			
			int cnta0[3]={0,0,0};
			int cntb0[3]={0,0,0};
			int cnta1[3]={0,0,0};
			int cntb1[3]={0,0,0};
			
			if(blkA>blkB){
				for(int i=0;i<len;i++){
					if(i<blkB){
						if(sa[i]=='1') cnta1[0]++;
						if(sa[i]=='0') cnta0[0]++;
						if(sb[i]=='1') cntb1[0]++;
						if(sb[i]=='0') cntb0[0]++;
					}
					if(i>blkB && i<blkA){
						if(sa[i]=='1') cnta1[1]++;
						if(sa[i]=='0') cnta0[1]++;
						if(sb[i]=='1') cntb1[1]++;
						if(sb[i]=='0') cntb0[1]++;
					}
					if(i>blkA){
						if(sa[i]=='1') cnta1[2]++;
						if(sa[i]=='0') cnta0[2]++;
						if(sb[i]=='1') cntb1[2]++;
						if(sb[i]=='0') cntb0[2]++;
					}
				}
				//处理b[0]中的1 
				if(cntb1[0] && cnta1[0]<cntb1[0] && cnta1[0]){
					cnt+=cnta1[0];
					cntb1[0]-=cnta1[0];
					cnta1[0]=0;
				} 
				else{
					if(cntb1[0] && cnta1[0]){
						cnt+=cntb1[0];
						cnta1[0]-=cntb1[0];
						cntb1[0]=0;
					}
				}
				if(cntb1[0] && cnta1[1]<cntb1[0] && cnta1[1]){
					cnt+=cnta1[1];
					cntb1[0]-=cnta1[1];
					cnta1[1]=0;
				}
				else{
					if(cntb1[0] && cnta1[1]){
						cnt+=cntb1[0];
						cnta1[1]-=cntb1[0];
						cntb1[0]=0;
					}
				}
				//处理b[0]中的0 
				if(cntb0[0] && cnta0[0]<cntb0[0] && cnta0[0]){
					cnt+=cnta0[0];
					cntb0[0]-=cnta0[0];
					cnta0[0]=0;
				} 
				else{
					if(cntb0[0] && cnta0[0]){
						cnt+=cntb0[0];
						cnta0[0]-=cntb0[0];
						cntb0[0]=0;
					}
				}
				if(cntb0[0] && cnta0[1]<cntb0[0] && cnta0[1]){
					cnt+=cnta0[1];
					cntb0[0]-=cnta0[1];
					cnta0[1]=0;
				}
				else{
					if(cntb0[0] && cnta0[1]){
						cnt+=cntb0[0];
						cnta0[1]-=cntb0[0];
						cntb0[0]=0;
					}
				}
				//处理b[1]中的1
				if(cntb1[1] && cnta1[0]<cntb1[1] && cnta1[0]){
					cnt+=cnta1[0];
					cntb1[1]-=cnta1[0];
					cnta1[0]=0;
				} 
				else{
					if(cntb1[1] && cnta1[0]){
						cnt+=cntb1[1];
						cnta1[0]-=cntb1[1];
						cntb1[1]=0;
					}
				}
				if(cntb1[1] && cnta1[1]<cntb1[1] && cnta1[1]){
					cnt+=cnta1[1];
					cntb1[1]-=cnta1[1];
					cnta1[1]=0;
				}
				else{
					if(cntb1[1] && cnta1[1]){
						cnt+=cntb1[1];
						cnta1[1]-=cntb1[1];
						cntb1[1]=0;
					}
				}
				//处理b[1]中的0
				if(cntb0[1] && cnta0[0]<cntb0[1] && cnta0[0]){
					cnt+=cnta0[0];
					cntb0[1]-=cnta0[0];
					cnta0[0]=0;
				} 
				else{
					if(cntb0[1] && cnta0[0]){
						cnt+=cntb0[1];
						cnta0[0]-=cntb0[1];
						cntb0[1]=0;
					}
				}
				if(cntb0[1] && cnta0[1]<cntb0[1] && cnta0[1]){
					cnt+=cnta0[1];
					cntb0[1]-=cnta0[1];
					cnta0[1]=0;
				}
				else{
					if(cntb0[1] && cnta0[1]){
						cnt+=cntb0[1];
						cnta0[1]-=cntb0[1];
						cntb0[1]=0;
					}
				}
				//处理b[2]中的1
				if(cntb1[2] && cnta1[2] && cnta1[2]<cntb1[2]){
					cnt+=cnta1[2];
					cntb1[2]-=cnta1[2];
					cnta1[2]=0;
				} 
				else{
					if(cntb1[2] && cnta1[2]){
						cnt+=cntb1[2];
						cnta1[2]-=cntb1[2];
						cntb1[2]=0;
					}
				}
				if(sb[blkB]=='1' && (cnta1[0] || cnta1[1])) cnt++;
				if(sb[blkB]=='0' && (cnta0[0] || cnta0[1])) cnt++;
				if(sa[blkA]=='1' && (cntb1[1] || cntb1[2])) cnt++;
				if(sa[blkA]=='0' && (cntb0[1] || cntb0[2])) cnt++;
			}
			else{
				for(int i=0;i<len;i++){
					if(i<blkA){
						if(sa[i]=='1') cnta1[0]++;
						if(sa[i]=='0') cnta0[0]++;
						if(sb[i]=='1') cntb1[0]++;
						if(sb[i]=='0') cntb0[0]++;
					}
					if(i>blkA && i<blkB){
						if(sa[i]=='1') cnta1[1]++;
						if(sa[i]=='0') cnta0[1]++;
						if(sb[i]=='1') cntb1[1]++;
						if(sb[i]=='0') cntb0[1]++;
					}
					if(i>blkB){
						if(sa[i]=='1') cnta1[2]++;
						if(sa[i]=='0') cnta0[2]++;
						if(sb[i]=='1') cntb1[2]++;
						if(sb[i]=='0') cntb0[2]++;
					}
				}
				//处理b[0]中的1 
				if(cnta1[0] && cntb1[0]<cnta1[0] && cntb1[0]){
					cnt+=cntb1[0];
					cnta1[0]-=cntb1[0];
					cntb1[0]=0;
				} 
				else{
					if(cnta1[0] && cntb1[0]){
						cnt+=cnta1[0];
						cntb1[0]-=cnta1[0];
						cnta1[0]=0;
					}
				}
				if(cnta1[0] && cntb1[1]<cnta1[0] && cntb1[1]){
					cnt+=cntb1[1];
					cnta1[0]-=cntb1[1];
					cntb1[1]=0;
				}
				else{
					if(cnta1[0] && cntb1[1]){
						cnt+=cnta1[0];
						cntb1[1]-=cnta1[0];
						cnta1[0]=0;
					}
				}
				//处理b[0]中的0 
				if(cnta0[0] && cntb0[0]<cnta0[0] && cntb0[0]){
					cnt+=cntb0[0];
					cnta0[0]-=cntb0[0];
					cntb0[0]=0;
				} 
				else{
					if(cnta0[0] && cntb0[0]){
						cnt+=cnta0[0];
						cntb0[0]-=cnta0[0];
						cnta0[0]=0;
					}
				}
				if(cnta0[0] && cntb0[1]<cnta0[0] && cntb0[1]){
					cnt+=cntb0[1];
					cnta0[0]-=cntb0[1];
					cntb0[1]=0;
				}
				else{
					if(cnta0[0] && cntb0[1]){
						cnt+=cnta0[0];
						cntb0[1]-=cnta0[0];
						cnta0[0]=0;
					}
				}
				//处理b[1]中的1
				if(cnta1[1] && cntb1[0]<cnta1[1] && cntb1[0]){
					cnt+=cntb1[0];
					cnta1[1]-=cntb1[0];
					cntb1[0]=0;
				} 
				else{
					if(cnta1[1] && cntb1[0]){
						cnt+=cnta1[1];
						cntb1[0]-=cnta1[1];
						cnta1[1]=0;
					}
				}
				if(cnta1[1] && cntb1[1]<cnta1[1] && cntb1[1]){
					cnt+=cntb1[1];
					cnta1[1]-=cntb1[1];
					cntb1[1]=0;
				}
				else{
					if(cnta1[1] && cntb1[1]){
						cnt+=cnta1[1];
						cntb1[1]-=cnta1[1];
						cnta1[1]=0;
					}
				}
				//处理b[1]中的0
				if(cnta0[1] && cntb0[0]<cnta0[1] && cntb0[0]){
					cnt+=cntb0[0];
					cnta0[1]-=cntb0[0];
					cntb0[0]=0;
				} 
				else{
					if(cnta0[1] && cntb0[0]){
						cnt+=cnta0[1];
						cntb0[0]-=cnta0[1];
						cnta0[1]=0;
					}
				}
				if(cnta0[1] && cntb0[1]<cnta0[1] && cntb0[1]){
					cnt+=cntb0[1];
					cnta0[1]-=cntb0[1];
					cntb0[1]=0;
				}
				else{
					if(cnta0[1] && cntb0[1]){
						cnt+=cnta0[1];
						cntb0[1]-=cnta0[1];
						cnta0[1]=0;
					}
				}
				//处理b[2]中的1
				if(cnta1[2] && cntb1[2] && cntb1[2]<cnta1[2]){
					cnt+=cntb1[2];
					cnta1[2]-=cntb1[2];
					cntb1[2]=0;
				} 
				else{
					if(cnta1[2] && cntb1[2]){
						cnt+=cnta1[2];
						cntb1[2]-=cnta1[2];
						cnta1[2]=0;
					}
				}
				if(sa[blkA]=='1' && (cntb1[0] || cntb1[1])) cnt++;
				if(sa[blkA]=='0' && (cntb0[0] || cntb0[1])) cnt++;
				if(sb[blkB]=='1' && (cnta1[1] || cnta1[2])) cnt++;
				if(sb[blkB]=='0' && (cnta0[1] || cnta0[2])) cnt++;
			}
			printf("%d\n",cnt);
		}
		if(len<=10){//枚举出所有合法字符串，两两比较取最大值  
			dfsa(0);
			memset(tmp,0,sizeof(tmp));
			dfsb(0);
			
			//printf("idxab:%d %d %d\n",idxa,idxb,len);
			int ans=0;
			for(int i=0;i<idxa;i++){
				for(int j=0;j<idxb;j++){
					ans=max(ans,getsame(i,j));
				}
			}
			printf("%d\n",ans);
			continue;
		}
		else{
			printf("\n");
		}
	}
}
//CCF!迎接我半径500行的达芬代码吧!!! 
