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

char s1[100010], s2[100010];
char chable1[100010], chable2[100010];
vector<int> pos;
int s1matched_qs[100010][2];
int s1unmatched_qs[100010][2];
int s2matched_qs[100010][2];
int s2unmatched_qs[100010][2];

int pos_delta[] = {0, 1};
int ans;
struct block {
	int start_pos, end_pos;
	bool owned;
};
vector<block> sb;
int n;

void dfs(int idx) {
	if(idx == (int)sb.size()) {
		int tmp = 0;
		for(int i = 1; i <= n; ++i) {
			tmp += s1[i] == s2[i];
		}
		ans = max(ans, tmp);
		return;
	}
	if(sb[idx].owned) {
		do {
			dfs(idx + 1);
		} while(next_permutation(s1 + sb[idx].start_pos, s1 + sb[idx].end_pos + 1));
	} else {
		do {
			dfs(idx + 1);
		} while(next_permutation(s2 + sb[idx].start_pos, s2 + sb[idx].end_pos + 1));
	}
}

int main() {
	freopen("edit.in", "r", stdin);
	freopen("edit.out", "w", stdout);
	int t;
	scanf("%d", &t);
	// cerr << 90;
	while(t--) {
		// memset(s1unmatched_qs, 0, sizeof(s1unmatched_qs));
		// memset(s1matched_qs, 0, sizeof(s1matched_qs));
		// memset(s2unmatched_qs, 0, sizeof(s2unmatched_qs));
		// memset(s2matched_qs, 0, sizeof(s2matched_qs));

		// int n;
		// scanf("%d", &n);
		// scanf("%s\n%s\n%s\n%s", s1 + 1, s2 + 1, chable1 + 1, chable2 + 1);
		// for(int i = 1; i <= n; i++) {
		//     chable1[i] -= '0';
		//     chable2[i] -= '0';
		//     s1[i] -= '0';
		//     s2[i] -= '0';
		//     if(chable1[i]) {
		//         pos.push_back(i);
		//         continue;
		//     }
		//     if(chable2[i]) {
		//         pos.push_back(i);
		//     }
		// }
		// // cerr << 90;
		// pos.push_back(n);
		// int ans = 0;
		// int idx = 1, barrier_idx = 0, firone = 0, secone = 0, firzero = 0, seczero = 0;
		// for(;idx <= n; ++idx) {
		//     if(s1[idx]) {
		//         firone++;
		//     } else {
		//         firzero++;
		//     }
		//     if(s2[idx]) {
		//         secone++;
		//     } else {
		//         seczero++;
		//     }
		//     if(idx == pos[barrier_idx]) {
		//         int tmp = min(firone, secone);
		//         ans += tmp;
		//         s1matched_qs[barrier_idx][1] = s2matched_qs[barrier_idx][1] = tmp;
		//         s1unmatched_qs[barrier_idx][1] = firone - tmp;
		//         s2unmatched_qs[barrier_idx][1] = secone - tmp;
		//         tmp = min(firzero, seczero);
		//         ans += tmp;
		//         s1matched_qs[barrier_idx][0] = s2matched_qs[barrier_idx][0] = tmp;
		//         s1unmatched_qs[barrier_idx][0] = firzero - tmp;
		//         s1unmatched_qs[barrier_idx][0] = seczero - tmp;
		//         barrier_idx++;
		//         firone = secone = firzero = seczero = 0;
		//         idx++;
		//     }
		// }
		// pos.pop_back();
		// for(int i = 0; i < pos.size(); ++i) {
		//     int idx = pos[i];
		//     if(!chable1[idx] && !chable2[idx]) {
		//         ans += s1[pos[i]] == s2[pos[i]];
		//         continue;
		//     }
		//     if(chable1[idx] && chable2[idx]) {
		//         // 两边都可以改
		//         // 如果两边相等
		//         // 尝试左右互换，ans+3
		//         if(s1[idx] == s2[idx]) {
		//             ans += 1;
		//             if(s1unmatched_qs[idx][!s1[idx]] && s2unmatched_qs[idx + 1][!s1[idx]]) {
		//                 ans += 2;
		//             } else if(s1unmatched_qs[idx + 1][!s1[idx]] && s2unmatched_qs[idx][!s1[idx]]) {
		//                 ans += 2;
		//             }
		//         } else {
		//             // 如果不相等，尝试左右互换，答案+2
		//             // 或者换到一个，ans+2
		//             if(s1unmatched_qs[idx][!s1[idx]] && s2unmatched_qs[idx + 1][!s2[idx]]) {
		//                 ans += 2;
		//             } else if(s1unmatched_qs[idx + 1][!s1[idx]] && s2unmatched_qs[idx][!s2[idx]]) {
		//                 ans += 2;
		//             } else if(s1unmatched_qs[idx][!s1[idx]] ||s1unmatched_qs[idx + 1][!s1[idx]] ) {
		//                 ans += 2;
		//             } else if(s2unmatched_qs[idx][!s2[idx]] ||s2unmatched_qs[idx + 1][!s2[idx]]) {
		//                 ans += 2;
		//             }
		//         }
		//         continue;
		//     }
		//     if(chable1[idx]) {
		//         if(s1[idx] == s2[idx]) {
		//             ans++;
		//         } else {
		//             // 尝试挪开
		//             if(s1unmatched_qs[idx][!s1[idx]]) {
		//                 ans += 1;
		//                 // if(s2unmatched_qs[idx][s1[idx]]) {
		//                     ans+=1;
		//                 // }
		//             } else if(s1unmatched_qs[idx + 1][!s1[idx]]) {
		//                 ans += 1;
		//                 // if(s2unmatched_qs[idx + 1][s1[idx]]) {
		//                     ans+=1;
		//                 // }
		//             }
		//         }
		//     } else {
		//         if(s1[idx] == s2[idx]) {
		//             ans++;
		//         } else {
		//             // 尝试挪开
		//             if(s2unmatched_qs[idx][!s2[idx]]) {
		//                 ans += 1;
		//                 if(s1unmatched_qs[idx][s2[idx]]) {
		//                     ans+=1;
		//                 }
		//             } else if(s2unmatched_qs[idx + 1][!s2[idx]]) {
		//                 ans += 1;
		//                 if(s1unmatched_qs[idx + 1][s2[idx]]) {
		//                     ans+=1;
		//                 }
		//             }
		//         }
		//     }
		// }
		// printf("%d\n", ans);
		// pos.clear();
		scanf("%d", &n);
		scanf("%s\n%s\n%s\n%s", s1 + 1, s2 + 1, chable1 + 1, chable2 + 1);
		bool a_special = true;
		for(int i = 1; i <= n; i++) {
			chable1[i] -= '0';
			chable2[i] -= '0';
			s1[i] -= '0';
			if(i != 1 && s1[i] != s1[i - 1]) {
				a_special = false;
			}
			s2[i] -= '0';
		}
		bool b_special = !strcmp(chable1 + 1, chable2 + 1);
		if(n <= 10) {
			sb.clear();
			ans = 0;
			int bg = 1;
			for(int idx = 1; idx <= n; ++idx) {
				if(!chable1[idx]) {
					sb.push_back(block {
						bg, idx - 1, true
					});
					sort(s1 + bg, s1 + idx - 1 + 1);
					bg = idx + 1;
				}
			}
			bg = 1;
			for(int idx = 1; idx <= n; ++idx) {
				if(!chable2[idx]) {
					sb.push_back(block {
						bg, idx - 1, false
					});
					sort(s2 + bg, s2 + idx - 1 + 1);
					bg = idx + 1;
				}
			}
			// cerr << 90;
			dfs(0);
			printf("%d\n", ans);
			// cerr << ans<<endl;
		} else if(a_special) {
			int ans = 0;
			for(int i = 1; i <= n; ++i) {
				ans += s1[i] == s2[i];
			}
			printf("%d\n", ans);
			// cerr << ans << endl;
		} else if(b_special) {
			int ans = 0;
			int firone = 0, secone = 0, firzero = 0, seczero = 0;
			for(int idx = 1; idx <= n; ++idx) {
				if(!chable1[idx]) {
					int tmp = min(firone, secone);
					ans += tmp;
					tmp = min(firzero, seczero);
					ans += tmp;
					firone = secone = firzero = seczero = 0;
					continue;
				}
				if(s1[idx]) {
					firone++;
				} else {
					firzero++;
				}
				if(s2[idx]) {
					secone++;
				} else {
					seczero++;
				}
			}
			int tmp = min(firone, secone);
			ans += tmp;
			tmp = min(firzero, seczero);
			ans += tmp;
			firone = secone = firzero = seczero = 0;
			for(int i = 1; i <= n; ++i) {
				if(!chable1[i] && !chable2[i]) {
					ans += s1[i] == s2[i];
				}
			}
			printf("%d\n", ans);
			// cerr << ans << endl;
		}
	}
	return 0;
}
