#include #include #include #include #include #include #define Min(x, y) ((x)<(y)?(x):(y)) #define Max(x, y) ((x)<(y)?(y):(x)) #define abs(x) ((x)<0?-(x):(x)) #define lowbit(x) ((x)&-(x)) typedef long long ll; typedef unsigned long long ull; typedef __int128 i128; using namespace std; const int N = 1e5 + 5; struct Seg { int l, r, cnt0, cnt1; }; int n, m1, m2; char s1[N], s2[N], t1[N], t2[N]; Seg q1[N], q2[N]; int main(void) { freopen("edit.in", "r", stdin); freopen("edit.out", "w", stdout); ios::sync_with_stdio(false); int T; cin >> T; while (T--) { cin >> n; int ans = 0; cin >> s1 + 1 >> s2 + 1 >> t1 + 1 >> t2 + 1; m1 = 0; for (int i=1; i<=n; ++i) { if (t1[i] == '0' || t1[i] != t1[i-1]) q1[++m1].l = i; q1[m1].r = i; q1[m1].cnt0 += (s1[i] == '0'); q1[m1].cnt1 += (s1[i] == '1'); } m2 = 0; for (int i=1; i<=n; ++i) { if (t2[i] == '0' || t2[i] != t2[i-1]) q2[++m2].l = i; q2[m2].r = i; q2[m2].cnt0 += (s2[i] == '0'); q2[m2].cnt1 += (s2[i] == '1'); } ans = 0; for (int i=1,j=1,plus,tmp; i<=m1; ++i) { while (j <= m2 && q2[j].r <= q1[i].r) { plus = tmp = 0; tmp = Min(q1[i].cnt1, Min(q2[j].cnt1, q2[j].r - q1[i].l + 1 - plus)); q1[i].cnt1 -= tmp; q2[j].cnt1 -= tmp; ans += tmp; plus += tmp; tmp = Min(q1[i].cnt0, Min(q2[j].cnt0, q2[j].r - q1[i].l + 1 - plus)); q1[i].cnt0 -= tmp; q2[j].cnt0 -= tmp; ans += tmp; ++j; } if (j <= m2 && q2[j].l <= q1[i].r) { plus = tmp = 0; tmp = Min(q1[i].cnt1, Min(q2[j].cnt1, q1[i].r - q2[j].l + 1 - plus)); q1[i].cnt1 -= tmp; q2[j].cnt1 -= tmp; ans += tmp; plus += tmp; tmp = Min(q1[i].cnt0, Min(q2[j].cnt0, q1[i].r - q2[j].l + 1 - plus)); q1[i].cnt0 -= tmp; q2[j].cnt0 -= tmp; ans += tmp; } } for (int i=1; i<=m1; ++i) q1[i].cnt0 = q1[i].cnt1 = 0; for (int i=1; i<=m2; ++i) q2[i].cnt0 = q2[i].cnt1 = 0; cout << ans << '\n'; } return 0; }