Problem:
Score : 400 points

Problem Statement

There are two persons, numbered 0 and 1, and a variable x whose initial value is 0.
The two persons now play a game.
The game is played in N rounds. The following should be done in the i-th round (1 \leq i \leq N):

Person S_i does one of the following:

Replace x with x \oplus A_i, where \oplus represents bitwise XOR.

Do nothing.

Person 0 aims to have x=0 at the end of the game, while Person 1 aims to have x \neq 0 at the end of the game.

Determine whether x becomes 0 at the end of the game when the two persons play optimally.

Solve T test cases for each input file.

Constraints

1 \leq T \leq 100

1 \leq N \leq 200

1 \leq A_i \leq 10^{18}

S is a string of length N consisting of 0 and 1.

All numbers in input are integers.

Input

Input is given from Standard Input in the following format.
The first line is as follows:

T

Then, T test cases follow.
Each test case is given in the following format:

N
A_1 A_2 \cdots A_N
S

Output

For each test case, print a line containing 0 if x becomes 0 at the end of the game, and 1 otherwise.

Sample Input 1

3
2
1 2
10
2
1 1
10
6
2 3 4 5 6 7
111000

Sample Output 1

1
0
0

In the first test case, if Person 1 replaces x with 0 \oplus 1=1, we surely have x \neq 0 at the end of the game, regardless of the choice of Person 0.

In the second test case, regardless of the choice of Person 1, Person 0 can make x=0 with a suitable choice.

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<bool> vb;
typedef vector<vb> vvb;
#define INF (1e9)

// ### BIT CHEAT SHEET ###
// and: a&b
// or: a|b
// not: ~a
// xor: a^b
//
// ビットbitにi番目のフラグが立っているかどうか: if (bit & (1<<i))
// ビットbitにi番目のフラグが消えているかどうか: if (!(bit & (1<<i)))
// ビットbitにi番目のフラグを立てる: bit |= (1<<i)
// ビットbitにi番目のフラグを消す: bit &= ~(1<<i)
// ビットbitに何個のフラグが立っているか: __builtin_popcountll(bit)
// ビットbitにi番目のフラグを立てたもの: bit | (1<<i)
// ビットbitにi番目のフラグを消したもの: bit & ~(1<<i)
//
// maskで表された部分のフラグをまとめて立てる: bit |= mask
// maskで表された部分のフラグをまとめて消す: bit &= ~mask
// maskで表された部分の情報のみを取り出したもの: bit & mask
// maskで表された部分のどれかのフラグが立っているかどうか: if (bit & mask)
// maskで表された部分のすべてのフラグが立っているかどうか: if ((bit & mask) == mask)
//
// nビットより上位のビット列: i>>n==i/(1<<n)
// nビットより下位のビット列: i&((1<<n)-1)==i%(1<<n)
//
// bitの最も右の1のみを抽出する: bit & (-bit)
// bitの最も右の1のみを0にする: bit & (bit - 1)
// 最も右の1は何桁目か: __builtin_ffsll(bit)
//

// 2^63>9*10^18
int main() {
  ll T;
  cin >> T;
  for (ll ii = 0; ii < T; ii++) {
    ll N;
    cin >> N;
    vi Arr(N);
    for (ll i = 0; i < N; i++) {
      cin >> Arr[i];
    }
    string S;
    cin >> S;
    vi A(0), B(0);
    for (ll i = 0; i < S.size(); i++) {
      if (S[i] == '0') {
        A.push_back(Arr[i]);
      } else {
        B.push_back(Arr[i]);
      }
    }

    vi X(70);
    for (ll a : A) {
      for (ll bit = 0; bit < 64; bit++) {
        if ((a >> bit) & 1) {
          if (X[bit] == 0) {
            X[bit] = a;
            break;
          } else {
            a ^= X[bit];
          }
        }
      }
    }

    bool f = false;
    for (ll b : B) {
      for (ll bit = 0; bit < 64; bit++) {
        if ((b >> bit) & 1) {
          b ^= X[bit];
        }
      }
      if (b != 0) {
        f = true;
      }
    }

    if (f)
      cout << 1 << endl;
    else
      cout << 0 << endl;
  }
}