Maximum OR sum of sub-arrays of two different arrays
Given two arrays of positive integers. Select two sub-arrays of equal size from each array and calculate maximum possible OR sum of the two sub-arrays.
Note: Let f(x, l, r) is the OR sum of all the elements in the range [l, r] in array x.
Examples :
Input : A[] = {1, 2, 4, 3, 2}
B[] = {2, 3, 3, 12, 1}
Output : 22
Explanation: Here, one way to get maximum
sum is to select sub-array [l = 2, r = 4]
f(A, 2, 4) = 2|4|3 = 7
f(B, 2, 4) = 3|3|12 = 15
So, f(A, 2, 4) + f(B, 2, 4) = 7 + 15 = 22.
This sum can be achieved in many other ways.
Input : A[] = {1, 2, 2}
B[] = {2, 1, 3}
Output : 6
Observe the operation of Bitwise OR operator. If we take two integers X and Y, then (X|Y >= X). It can be proved by taking some examples. Lets derive a formula using the above equation.
and also
from the above two equations,
So, we get maximum sum when we take the OR of the whole array ->
Below is the implementation of above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void MaximumSum( int a[], int b[], int n)
{
int sum1 = 0, sum2 = 0;
for ( int i = 0; i < n; i++) {
sum1 |= a[i];
sum2 |= b[i];
}
cout << sum1 + sum2 << endl;
}
int main()
{
int A[] = { 1, 2, 4, 3, 2 };
int B[] = { 2, 3, 3, 12, 1 };
int n = sizeof (A) / sizeof (A[0]);
MaximumSum(A, B, n);
return 0;
}
|
Java
class GFG {
static void MaximumSum( int a[], int b[], int n)
{
int sum1 = 0 , sum2 = 0 ;
for ( int i = 0 ; i < n; i++) {
sum1 |= a[i];
sum2 |= b[i];
}
System.out.println(sum1 + sum2);
}
public static void main(String arg[])
{
int A[] = { 1 , 2 , 4 , 3 , 2 };
int B[] = { 2 , 3 , 3 , 12 , 1 };
int n = A.length;
MaximumSum(A, B, n);
}
}
|
Python3
def MaximumSum(a, b, n):
sum1 = 0
sum2 = 0
for i in range ( 0 , n):
sum1 | = a[i]
sum2 | = b[i]
print (sum1 + sum2)
A = [ 1 , 2 , 4 , 3 , 2 ]
B = [ 2 , 3 , 3 , 12 , 1 ]
n = len (A)
MaximumSum(A, B, n)
|
C#
using System;
class GFG {
static void MaximumSum( int []a, int []b, int n)
{
int sum1 = 0, sum2 = 0;
for ( int i = 0; i < n; i++)
{
sum1 |= a[i];
sum2 |= b[i];
}
Console.WriteLine(sum1 + sum2);
}
public static void Main()
{
int []A = {1, 2, 4, 3, 2};
int []B = {2, 3, 3, 12, 1};
int n = A.Length;
MaximumSum(A, B, n);
}
}
|
PHP
<?php
function MaximumSum( $a , $b , $n )
{
$sum1 = 0;
$sum2 = 0;
for ( $i = 0; $i < $n ; $i ++)
{
$sum1 |= $a [ $i ];
$sum2 |= $b [ $i ];
}
echo ( $sum1 + $sum2 ). "\n" ;
}
$A = array (1, 2, 4, 3, 2 );
$B = array (2, 3, 3, 12, 1 );
$n = sizeof( $A ) / sizeof( $A [0]);
MaximumSum( $A , $B , $n );
?>
|
Javascript
<script>
function MaximumSum(a, b, n)
{
let sum1 = 0, sum2 = 0;
for (let i = 0; i < n; i++) {
sum1 |= a[i];
sum2 |= b[i];
}
document.write(sum1 + sum2);
}
let A = [1, 2, 4, 3, 2];
let B = [2, 3, 3, 12, 1];
let n = A.length;
MaximumSum(A, B, n);
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Last Updated :
28 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...