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 <stdio.h>

int a;
long long int x[210];
char y[210];
int check[210][3][3][110][110];

int func(int k, int value1, int value2, int type1, int type2)
{
	//if(type1==1&&type2==2) printf("%d %d %d\n",k,value1,value2);
	if(k>a)
	{
		if(value1==0&&value2==0) return 0;
		else return 1;
	}
	if(check[k][value1][value2][type1][type2]!=-1) return check[k][value1][value2][type1][type2];
	
	int C1 = ((x[k]&(1<<type1))==0?0:1);
	int C2 = ((x[k]&(1<<type2))==0?0:1);
	
	int t1 = value1;
	int t2 = (value1^C1);
	int t3 = value2;
	int t4 = (value2^C2);
	//if(type1==1&&type2==2) printf("%d %d %d %d!!\n",t1,t2,t3,t4);
	
	if(y[k]=='0')
	{
		int s1 = func(k+1,t1,t3,type1,type2);
		int s2 = func(k+1,t2,t4,type1,type2);
		if(s1==0 || s2==0) return check[k][value1][value2][type1][type2]=0;
		else return check[k][value1][value2][type1][type2]=1;
	}
	else
	{
		int s1 = func(k+1,t1,t3,type1,type2);
		int s2 = func(k+1,t2,t4,type1,type2);
		if(s1==1 || s2==1) return check[k][value1][value2][type1][type2]=1;
		else return check[k][value1][value2][type1][type2]=0;
	}
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&a);
		for(int i=0;i<=a+1;i++) for(int j1=0;j1<=1;j1++) for(int j2=0;j2<=1;j2++) for(int k1=0;k1<=60;k1++) for(int k2=0;k2<=60;k2++) check[i][j1][j2][k1][k2] = -1;
		for(int i=1;i<=a;i++) scanf("%lld",&x[i]);
		scanf("%s",y+1);
		
		for(int i=0;i<60;i++)
		{
			for(int j=i+1;j<60;j++)
			{
				if(func(1,0,0,i,j)==1)
				{
					printf("1\n");
					goto u;
				}
			}
		}
		printf("0\n");
		u:;
	}
}