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

// 1個置くと3増えて全体でN*Q
// クオリティQは3の倍数になる必要がある(N != 0 mod 3)

using block = vector<string>;
// Quality 1
block b3 = {
        "a..",
        "a..",
        ".aa"
};
// Quality 3
block b4 = {
        "aacd",
        "bbcd",
        "cdaa",
        "cdbb"
};
// Quality 3
block b5 = {
        "aabbc",
        "bc..c",
        "bc..d",
        "c.ccd",
        "cddee"
};
// Quality 3
block b7 = {
        "ac..c..",
        "ac..c..",
        "b.cc.cc",
        "bc..c..",
        "ac..c..",
        "a.cc.cc",
        ".aabbaa"
};

void horizontal_add(block &a, block b){
    for (int i = 0; i < a.size(); ++i) a[i] += b[i];
}

void vertical_add(block &a, block b){
    a.insert(a.end(), b.begin(), b.end());
}

block solve_k(int n, block b){
    block res = b;
    for (int i = 0; i < n - 1; ++i) {
        horizontal_add(res, b);
    }
    block unit = res;
    for (int i = 0; i < n - 1; ++i) {
        vertical_add(res, unit);
    }
    return res;
}

block solve(int n){
    block res;
    if (n % 3 == 0) return solve_k(n/3, b3);
    if (n % 4 == 0) return solve_k(n/4, b4);
    int t = __builtin_ctz(n);
    int m = n >> t; // m >= 5 が保証される
    if ((m - 1) % 4) res = b7;
    else res = b5;
    for (int i = 0; i < (m - 5) / 4; ++i) {
        horizontal_add(res, block(res.size(), "...."));
        string s(res.size(), '.');
        block below(4, s);
        horizontal_add(below, b4);
        vertical_add(res, below);
    }
    return solve_k(n/m, res);
}

int main() {
    int N;
    cin >> N;
    if (N == 2) {
        cout << -1 << "\n";
    } else {
        auto ans = solve(N);
        for (int i = 0; i < N; ++i) {
            cout << ans[i] << "\n";
        }
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pli = pair<ll, int>;
using pil = pair<int, ll>;
using uint = unsigned int;
template <typename T>
using Graph = vector<vector<T>>;
const int MOD = 1e9 + 7;
const ld PI = acosl(-1);

int mdigit(ll val) {
    int l = 0, r = 61;
    while (r - l > 1) {
        int mid = (l + r) / 2;
        ll bit = (1LL << r) - (1LL << mid);
        (val & bit ? l : r) = mid;
    }
    return l;
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);

    int T;
    cin >> T;
    for (int a = 0; a < T; ++a) {
        int N;
        cin >> N;
        vector<ll> A(N);
        for (int i = 0; i < N; ++i)
            cin >> A[i];
        string S;
        cin >> S;

        bool isok = true;
        vector<ll> v(61);
        for (int i = N - 1; i >= 0; --i) {
            int tmp;
            while (A[i] && v[tmp = mdigit(A[i])])
                A[i] ^= v[tmp];
            if (A[i]) {
                if (S[i] == '0')
                    v[tmp] = A[i];
                else {
                    isok = false;
                    break;
                }
            }
        }

        cout << !isok << '\n';
    }

    return 0;
}
