In this HackerEarth Shubham and Subarray Xor problem solution You are given an array consisting of n integers a1,a2,...an. Find the maximum value of xor of sum of 2 disjoint subarrays i.e maximize ( sum(l1,r1) xor sum(l2,r2) )
where 1 <= l1 <= r1 < l2 <= r2 <= n.
Note: sum(l,r) denotes the sum of elements from indices l to r both inclusive.


HackerEarth Shubham and Subarray Xor problem solution


HackerEarth Shubham and Subarray Xor problem solution.

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define inf 1000000000000
#define mod 1000000007
#define pb push_back
#define mp make_pair
#define all(v) v.begin(),v.end()
#define S second
#define F first
#define boost1 ios::sync_with_stdio(false);
#define boost2 cin.tie(0);
#define mem(a,val) memset(a,val,sizeof a)
#define endl "\n"
#define maxn 820000

ll tr[8*maxn][2],nn=1,cnt[8*maxn][2],arr[905],sum[905];
void add(ll a) {
ll t = 1;
for (ll i = 31; i >= 0; --i) {
int now = (a >> i) & 1;
if (!tr[t][now]) {
tr[t][now] = ++nn;
}
cnt[t][now]++;
t = tr[t][now];
}
}
ll getMax(ll a) {
ll t = 1, res = 0;
for (ll i = 31; i >= 0; --i) {
ll now = (a >> i) & 1;
now = !now;
if (tr[t][now] && cnt[t][now]) {
t = tr[t][now];
res += (1 << i) * 1;
} else {
t = tr[t][!now];
}
}
return res;
}
inline ll getsum(ll l,ll r)
{
assert(l<=r);
return sum[r]-sum[l-1];
}
int main()
{
boost1;boost2;
ll i,j,n,x,y,val,ans;
cin>>n;
for(i=1;i<=n;i++)
cin>>arr[i];
sum[1]=arr[1];
for(i=2;i<=n;i++)
sum[i]=sum[i-1]+arr[i];
add(arr[n]);
ans=0;
for(i=n-1;i>=1;i--)
{
for(j=i;j>=1;j--)
{
val=getsum(j,i);
ans=max(ans,getMax(val));
}
for(j=i;j<=n;j++)
{
val=getsum(i,j);
add(val);
}
}
cout<<ans;

return 0;
}

Second solution

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

#define next _nxt

const int N = 10000005;
int sz = 0, next[2][N], arr[905], sum[905];
bool created[N];

void insert (int s) {
int v = 0;
for (int i = 30; i >= 0; i--) {
int c = (s >> i) & 1;
if (!created[next[c][v]]) {
next[c][v] = ++sz;
created[sz] = true;
}
v = next[c][v];
}
}

int search (int tmp) {
int v = 0, ans = 0;
for (int i = 30; i >= 0; i--) {
int c = (tmp >> i) & 1;
if(created[next[1 ^ c][v]]){
ans |= ((1 ^ c) << i);
v = next[1 ^ c][v];
}
else{
ans |= (c << i);
v = next[c][v];
}
}
return ans;
}

int main(){
int i,j,n,maxi = 0,curr;
scanf("%d", &n);
for(i = 1; i <= n; i++){
scanf("%d", &arr[i]);
sum[i] = sum[i - 1] + arr[i];
}
for(i = 1; i <= n; i++){
for(j = 1; j <= i; j++)
insert(sum[i] - sum[j - 1]);
for(j = i + 1; j <= n; j++)
maxi = max(maxi, (sum[j] - sum[i]) ^ search(sum[j] - sum[i]));
}
printf("%d\n", maxi);
return 0;
}