#include <bits/stdc++.h>
 
using namespace std;
 
using i64 = long long;
#define forn(a, e) for (i64 a = 0; a < (i64)(e); a++)
#define forr(a, s, e) for (i64 a = s; a < (i64)(e); a++)
#define fore(e, a) for (auto& e : a)
 
#ifdef LOCAL
#define logv(a) {cerr << #a << " = "; fore(e, a) {cerr << e << " ";} cerr << "\n";}
#define logvp(a) {cerr << #a << " = "; fore(e, a) {cerr << "(" << e.first << ", " << e.second << ") ";} cerr << "\n";}
#define logvv(a) {cerr << #a << " = \n"; fore(r, a) { fore(e, r) {cerr << e << " ";} cerr << "\n";} }
#define logvf(a, field) {cerr << #a"."#field << " = \n"; fore(e, a) { cerr << e.field << " ";} cerr << "\n"; }
#define logvff(a, f1, f2) {cerr << #a".{"#f1 << ", "#f2 << "} = \n"; fore(e, a) { cerr << "(" << e.f1 <<", " << e.f2 << ") ";} cerr << "\n"; }
#define logs(a) cerr << #a << " = " << (a) << "\n";
#define logss(a, b) cerr << #a << " = " << (a) << ", " << #b << " = " << (b) << "\n";
#define logp(a) cerr << #a << " = " << "(" << a.first << ", " << a.second << ")" << "\n";
#define cond(pred, stmt) if (pred) { stmt }
#else
#define logv(a)
#define logvp(a)
#define logvv(a)
#define logvf(a, field)
#define logvff(a, f1, f2)
#define logs(a)
#define logss(a, b)
#define logp(a)
#define cond(pred, stmt)
#endif
 
using iip = pair<int, int>;
using llp = pair<i64, i64>;
using ivec = vector<int>;
using llvec = vector<i64>;
using svec = vector<string>;
template<typename T> using vec = vector<T>;
 
template<typename T, typename Dim>
auto make_vec(T value, Dim dim) { return vector<T>(dim, value); }
template<typename T, typename Dim1, typename... Dim>
auto make_vec(T value, Dim1 dim1, Dim... dims) { return make_vec(make_vec(value, dims...), dim1); }
 
template<typename T>
bool uax(T& v, const T& newv) { if (v < newv) { v = newv; return true; } else return false; }
template<typename T>
bool uin(T& v, const T& newv) { if (v > newv) { v = newv; return true; } else return false; }
 
template<typename T>
istream& operator>>(istream& is, vector<T>& c) { for (auto& e : c) is >> e; return is; }
template<typename T, size_t N>
istream& operator>>(istream& is, array<T, N>& c) { for (auto& e : c) is >> e; return is; }
 
template<typename ...T>
istream& read(T&... args) { return (cin >> ... >> args); }
 
static mt19937 rande(123123);
template<typename T>
T rand_int(T from, T to) { uniform_int_distribution<T> distr(from, to); return distr(rande); }
 
constexpr i64 INF = 1e18;
// constexpr int MXB = 4;
constexpr int MXB = 62;
using bin = bitset<MXB>;
constexpr i64 M = 1e9 + 7;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    rande.seed(chrono::steady_clock::now().time_since_epoch().count());

    int t;
    read(t);
    while (t--) {
        int n;
        read(n);
        llvec a(n);
        read(a);

        string s;
        read(s);

        bool ok = true;
        forn(i, n) {
            if (s[i] == '1') {
                i64 num = a[i];

                vec<bin> bs;
                forr(j, i + 1, n) {
                    if (s[j] == '0') {
                        bs.emplace_back(a[j]);
                    }
                }
                if (bs.empty()) {
                    ok = false;
                    break;
                }
                // logv(bs);

                ivec used(bs.size());
                for (int p = MXB - 1; p >= 0; p--) {
                    i64 id = -1;
                    forn(j, bs.size()) {
                        if (bs[j][p] && !used[j]) {
                            id = j;
                            break;
                        }
                    }

                    if (id != -1) {
                        forn(j, bs.size()) if (j != id && bs[j][p]) {
                            bs[j] ^= bs[id];
                        }
                        used[id] = true;
                        // logs(bs[id]);
                        // logv(bs);
                    }
                }

                auto mb = [](i64 x) {
                    int cc = 0;
                    while(x) {
                        cc++;
                        x >>= 1;
                    }
                    return cc - 1;
                };
                
                llvec bb(MXB, -1);
                forn(j, bs.size()) {
                    if (used[j]) {
                        bb[mb(bs[j].to_ullong())] = bs[j].to_ullong();
                    }

                }

                i64 res = 0;
                forn(j, MXB) {
                    if (bb[j] != -1 && (num & (1ll << j))) {
                        res ^= bb[j];
                    }
                }
                
                if (res != num) {
                    
                    // logss(i, num);
                    // logs(res);
                    // logv(bs);
                    // logv(bb);

                    ok = false;
                    break;
                }
            }
        }

        if (ok) {
            cout << '0' << endl;
        } else {
            cout << '1' << endl;
        }
    }
}


Measured memory_bytes: 3620