# Subarray XOR Solution Codechef

## Subarray XOR Solution Codechef

Mary loves binary strings. Given a binary string S, she defines the beauty of the string as the bitwise XOR of decimal representations of all substrings of S.

Find the beauty of string S. Since the answer can be huge, print it modulo 998244353.

For example, the decimal representation of binary string 1101 is 1⋅23+1⋅22+0⋅21+1⋅20=8+4+0+1=13. Kindly refer sample explanation for more such examples.

A string A is a substring of a string B if A can be obtained from B by deleting several (possibly zero) characters from the beginning and several (possibly zero) characters from the end.

Input Format

• The first line of input contains a single integer T, denoting the number of test cases. The description of test cases follow.
• First line of each test case contains one integer N – the length of the binary string.
• Second line of each test case contains the binary string S.

Output Format

For each test case, output in a single line, beauty of the string modulo 998244353.

Constraints

• 1≤T≤100
• 1≤N≤105
• Sum of N over all test cases does not exceed 2⋅105

Sample Input 1

``````3
2
10
3
101
4
1111``````

Sample Output 1

``````3
6
12``````

Explanation

• Test Case 1: All substrings of the string S=10 are [1,0,10]. The decimal representation of these substrings is denoted by the array [1,0,2]. Bitwise XOR of all these values is 1⊕0⊕2=3.
• Test Case 2: All substrings of the string S=101 are [1,0,1,10,01,101]. The decimal representation of these substrings is denoted by the array [1,0,1,2,1,5]. Bitwise XOR of all these values is: 1⊕0⊕1⊕2⊕1⊕5=6.
• Test Case 3: All substrings of the string S=1111 are [1,1,1,1,11,11,11,111,111,1111]. The decimal representation of these substrings is denoted by the array [1,1,1,1,3,3,3,7,7,15]. Bitwise XOR of all these values is: 1⊕1⊕1⊕1⊕3⊕3⊕3⊕7⊕7⊕15=12.

### SOLUTION

Program: Subarray XOR Solution Codechef in Python

``````mod=998244353
for i in range(int(input())):
n=int(input())
l=list(map(int,input()))
temp=[0 for i in range(n)]
ans=[0 for i in range(n)]
for i in range(n):
if l[i]==0 or i%2==1:
continue
temp[i]+=1
ans[0]=temp[0]
for i in range(1,n):
ans[i]=(temp[i]+ans[i-1])%2
mul=1
out=0
for i in range(n-1,-1,-1):
if ans[i]==0:
mul*=2
mul%=mod
continue
out+=mul
out%=mod
mul*=2
mul%=mod
print(out)``````

Program: Subarray XOR Solution Codechef in C++

``````#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long n;
cin>>n;
string s;
cin>>s;
long long result[n]={0};
if(s[0]=='1')
{
result[0]=1;
}
long long prev=result[0];
for(int i=1;i<n;i++)
{
if(s[i]=='1')
{
prev+=(i+1);
}
result[i]=prev;
result[i]=result[i]%2;
}
long long ans=0,power=1;
for(int i=n-1;i>=0;i--)
{
if(result[i])
{
ans+=power;
ans%=998244353;
}
power*=2;
power%=998244353;
}
cout<<ans%998244353<<endl;
}
}``````

Program: Subarray XOR Solution Codechef in Java

``````import java.util.*;
import java.lang.*;
import java.io.*;
class Codechef
{
public static void main (String[] args) throws java.lang.Exception
{

int mod = 998244353;
while(t--!=0){

long[] arr = new long[n];

arr[0] = (s.charAt(0)=='1') ? 1 : 0;
int noOf1s = (int)arr[0];

if(arr[0]==1){
s.setCharAt(0, '1');
}
else s.setCharAt(0, '0');

for (int i = 1; i < n; i++){
if(s.charAt(i)=='1') noOf1s++;

arr[i] = arr[i-1] + noOf1s;

long temp = (i+1)*(arr[i]-arr[i-1]) - arr[i-1];
if(temp%2==1){
s.setCharAt(i, '1');
}
else{
s.setCharAt(i, '0');
}
}
int pwrTwo[] = new int[n];
pwrTwo[0] = 1;

for (int i = 1; i < n; i++){
pwrTwo[i] = (pwrTwo[i-1]*2)%mod;
}
int res = 0;
int i = 0;
int j = n-1;

while(i < n){
if(s.charAt(j)=='1'){
res+=(pwrTwo[i]);
res%=mod;
}
i++;
j--;
}
System.out.println(res);
}
}
}``````