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

const int maxn = 1e5 + 5;

namespace sol {
    int n;
    char s1[maxn], s2[maxn], t1[maxn], t2[maxn];
    struct dsu {
        int fa[maxn], sz[maxn][2];
        int find(int u) {
            return fa[u] == u ? u : fa[u] = find(fa[u]);
        }
        void merge(int u, int v) {
            u = find(u), v = find(v);
            if (u == v) return;
            fa[v] = u;
            sz[u][0] += sz[v][0];
            sz[u][1] += sz[v][1];
        }
    } d1, d2;
    void solve() {
        scanf("%d%s%s%s%s", &n, s1 + 1, s2 + 1, t1 + 1, t2 + 1);
        for (int i = 1; i <= n; ++i) {
            d1.fa[i] = d2.fa[i] = i;
            d1.sz[i][s1[i] == '1'] = 1;
            d1.sz[i][s1[i] != '1'] = 0;
            d2.sz[i][s2[i] == '1'] = 1;
            d2.sz[i][s2[i] != '1'] = 0;
        }
        for (int i = 1; i <= n; ++i) {
            if (t1[i] == '1' && t1[i - 1] == '1')
                d1.merge(i, i - 1);
            if (t2[i] == '1' && t2[i - 1] == '1')
                d2.merge(i, i - 1);
        }
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            int u = d1.find(i), v = d2.find(i);
            if (d1.sz[u][0] && d2.sz[v][0])
                ++ans, --d1.sz[u][0], --d2.sz[v][0];
            else if (d1.sz[u][1] && d2.sz[v][1])
                ++ans, --d1.sz[u][1], --d2.sz[v][1];
        }
        printf("%d\n", ans);
    }
}

int main() {
    freopen("edit.in", "r", stdin);
    freopen("edit.out", "w", stdout);
    int T;
    scanf("%d", &T);
    while (T--) sol::solve();
    return 0;
}
