所有子阵异或的异或|集1

给定一个整数数组,我们需要得到所有子数组XOR的总XOR,其中子数组XOR可以通过对其所有元素进行XOR得到。 例如:

null
Input : arr[] = [3, 5, 2, 4, 6]Output : 7Total XOR of all subarray XORs is,(3) ^ (5) ^ (2) ^ (4) ^ (6)(3^5) ^ (5^2) ^ (2^4) ^ (4^6)(3^5^2) ^ (5^2^4) ^ (2^4^6)(3^5^2^4) ^ (5^2^4^6) ^(3^5^2^4^6) = 7     Input : arr[] = {1, 2, 3}Output : 2Input : arr[] = {1, 2, 3, 4}Output : 0

A. 简单解决方案 就是生成所有子数组并计算所有子数组的异或。以下是上述理念的实施情况:

C++

// C++ program to get total xor of all subarray xors
#include <bits/stdc++.h>
using namespace std;
// Returns XOR of all subarray xors
int getTotalXorOfSubarrayXors( int arr[], int N)
{
//  initialize result by 0 as (a xor 0 = a)
int res = 0;
// select the starting element
for ( int i=0; i<N; i++)
// select the eNding element
for ( int j=i; j<N; j++)
// Do XOR of elements in current subarray
for ( int k=i; k<=j; k++)
res = res ^ arr[k];
return res;
}
// Driver code to test above methods
int main()
{
int arr[] = {3, 5, 2, 4, 6};
int N = sizeof (arr) / sizeof (arr[0]);
cout << getTotalXorOfSubarrayXors(arr, N);
return 0;
}


JAVA

// java program to get total XOR
// of all subarray xors
public class GFG {
// Returns XOR of all subarray xors
static int getTotalXorOfSubarrayXors(
int arr[], int N)
{
// initialize result by
// 0 as (a xor 0 = a)
int res = 0 ;
// select the starting element
for ( int i = 0 ; i < N; i++)
// select the eNding element
for ( int j = i; j < N; j++)
// Do XOR of elements
// in current subarray
for ( int k = i; k <= j; k++)
res = res ^ arr[k];
return res;
}
// Driver code
public static void main(String args[])
{
int arr[] = { 3 , 5 , 2 , 4 , 6 };
int N = arr.length;
System.out.println(
getTotalXorOfSubarrayXors(arr, N));
}
}
// This code is contributed by Sam007.


Python 3

# python program to get total xor
# of all subarray xors
# Returns XOR of all subarray xors
def getTotalXorOfSubarrayXors(arr, N):
# initialize result by 0 as
# (a xor 0 = a)
res = 0
# select the starting element
for i in range ( 0 , N):
# select the eNding element
for j in range (i, N):
# Do XOR of elements in
# current subarray
for k in range (i, j + 1 ):
res = res ^ arr[k]
return res
# Driver code to test above methods
arr = [ 3 , 5 , 2 , 4 , 6 ]
N = len (arr)
print (getTotalXorOfSubarrayXors(arr, N))
# This code is contributed by Sam007.


C#

// C# program to get total XOR
// of all subarray xors
using System;
class GFG {
// Returns XOR of all subarray xors
static int getTotalXorOfSubarrayXors( int []arr,
int N)
{
// initialize result by
// 0 as (a xor 0 = a)
int res = 0;
// select the starting element
for ( int i = 0; i < N; i++)
// select the eNding element
for ( int j = i; j < N; j++)
// Do XOR of elements
// in current subarray
for ( int k = i; k <= j; k++)
res = res ^ arr[k];
return res;
}
// Driver Code
static void Main()
{
int []arr = {3, 5, 2, 4, 6};
int N = arr.Length;
Console.Write(getTotalXorOfSubarrayXors(arr, N));
}
}
// This code is contributed by Sam007


PHP

<?php
// PHP program to get total
// xor of all subarray xors
// Returns XOR of all subarray xors
function getTotalXorOfSubarrayXors( $arr , $N )
{
// initialize result by
// 0 as (a xor 0 = a)
$res = 0;
// select the starting element
for ( $i = 0; $i < $N ; $i ++)
// select the eNding element
for ( $j = $i ; $j < $N ; $j ++)
// Do XOR of elements in
// current subarray
for ( $k = $i ; $k <= $j ; $k ++)
$res = $res ^ $arr [ $k ];
return $res ;
}
// Driver code
$arr = array (3, 5, 2, 4, 6);
$N = sizeof( $arr );
echo getTotalXorOfSubarrayXors( $arr , $N );
// This code is contributed by nitin mittal.
?>


Javascript

<script>
// JavaScript program for the above approach
// Returns XOR of all subarray xors
function getTotalXorOfSubarrayXors(
arr, N)
{
// initialize result by
// 0 as (a xor 0 = a)
let res = 0;
// select the starting element
for (let i = 0; i < N; i++)
// select the eNding element
for (let j = i; j < N; j++)
// Do XOR of elements
// in current subarray
for (let k = i; k <= j; k++)
res = res ^ arr[k];
return res;
}
// Driver Code
// Both a[] and b[] must be of same size.
let arr = [3, 5, 2, 4, 6];
let N = arr.length;
document.write(getTotalXorOfSubarrayXors(arr, N));
// This code is contributed by code_hunt.
</script>


输出:

7

时间复杂度:O(N) 3. ) 一 有效解决方案 基于枚举所有子数组的思想,我们可以计算每个元素在所有子数组中出现的频率,如果元素的频率是奇数,那么它将包含在最终结果中,否则不会。

As in above example, 3 occurred 5 times,5 occurred 8 times,2 occurred 9 times,4 occurred 8 times,6 occurred 5 timesSo our final result will be xor of all elements which occurred odd number of timesi.e. 3^2^6 = 7From above occurrence pattern we can observe that number at i-th index will have (i + 1) * (N - i) frequency. 

所以我们可以迭代所有元素一次,然后计算它们的频率,如果它是奇数,那么我们可以通过将其与结果进行XOR运算,将其包含在最终结果中。 解决方案的总时间复杂度为O(N)

C++

// C++ program to get total
// xor of all subarray xors
#include <bits/stdc++.h>
using namespace std;
// Returns XOR of all subarray xors
int getTotalXorOfSubarrayXors( int arr[],
int N)
{
// initialize result by 0
// as (a XOR 0 = a)
int res = 0;
// loop over all elements once
for ( int i = 0; i < N; i++)
{
// get the frequency of
// current element
int freq = (i + 1) * (N - i);
// Uncomment below line to print
// the frequency of arr[i]
// cout << arr[i] << " " << freq << endl;
// if frequency is odd, then
// include it in the result
if (freq % 2 == 1)
res = res ^ arr[i];
}
// return the result
return res;
}
// Driver Code
int main()
{
int arr[] = {3, 5, 2, 4, 6};
int N = sizeof (arr) / sizeof (arr[0]);
cout << getTotalXorOfSubarrayXors(arr, N);
return 0;
}


JAVA

// java program to get total xor
// of all subarray xors
import java.io.*;
public class GFG {
// Returns XOR of all subarray
// xors
static int getTotalXorOfSubarrayXors(
int arr[], int N)
{
// initialize result by 0
// as (a XOR 0 = a)
int res = 0 ;
// loop over all elements once
for ( int i = 0 ; i < N; i++)
{
// get the frequency of
// current element
int freq = (i + 1 ) * (N - i);
// Uncomment below line to print
// the frequency of arr[i]
// if frequency is odd, then
// include it in the result
if (freq % 2 == 1 )
res = res ^ arr[i];
}
// return the result
return res;
}
public static void main(String[] args)
{
int arr[] = { 3 , 5 , 2 , 4 , 6 };
int N = arr.length;
System.out.println(
getTotalXorOfSubarrayXors(arr, N));
}
}
// This code is contributed by Sam007.


Python 3

# Python3 program to get total
# xor of all subarray xors
# Returns XOR of all
# subarray xors
def getTotalXorOfSubarrayXors(arr, N):
# initialize result by 0
# as (a XOR 0 = a)
res = 0
# loop over all elements once
for i in range ( 0 , N):
# get the frequency of
# current element
freq = (i + 1 ) * (N - i)
# Uncomment below line to print
# the frequency of arr[i]
# if frequency is odd, then
# include it in the result
if (freq % 2 = = 1 ):
res = res ^ arr[i]
# return the result
return res
# Driver Code
arr = [ 3 , 5 , 2 , 4 , 6 ]
N = len (arr)
print (getTotalXorOfSubarrayXors(arr, N))
# This code is contributed
# by Smitha


C#

// C# program to get total xor
// of all subarray xors
using System;
class GFG
{
// Returns XOR of all subarray xors
static int getTotalXorOfSubarrayXors( int []arr,
int N)
{
// initialize result by 0
// as (a XOR 0 = a)
int res = 0;
// loop over all elements once
for ( int i = 0; i < N; i++)
{
// get the frequency of
// current element
int freq = (i + 1) * (N - i);
// Uncomment below line to print
// the frequency of arr[i]
// if frequency is odd, then
// include it in the result
if (freq % 2 == 1)
res = res ^ arr[i];
}
// return the result
return res;
}
// Driver Code
public static void Main()
{
int []arr = {3, 5, 2, 4, 6};
int N = arr.Length;
Console.Write(getTotalXorOfSubarrayXors(arr, N));
}
}
// This code is contributed by Sam007


PHP

<?php
// PHP program to get total
// xor of all subarray xors
// Returns XOR of all subarray xors
function getTotalXorOfSubarrayXors( $arr ,
$N )
{
// initialize result by 0
// as (a XOR 0 = a)
$res = 0;
// loop over all elements once
for ( $i = 0; $i < $N ; $i ++)
{
// get the frequency of
// current element
$freq = ( $i + 1) * ( $N - $i );
// if frequency is odd, then
// include it in the result
if ( $freq % 2 == 1)
$res = $res ^ $arr [ $i ];
}
// return the result
return $res ;
}
// Driver Code
$arr = array (3, 5, 2, 4, 6);
$N = count ( $arr );
echo getTotalXorOfSubarrayXors( $arr , $N );
// This code is contributed by anuj_67.
?>


Javascript

<script>
// Javascript program to get total
// xor of all subarray xors
// Returns XOR of all subarray xors
function getTotalXorOfSubarrayXors(arr, N)
{
// initialize result by 0
// as (a XOR 0 = a)
let res = 0;
// loop over all elements once
for (let i = 0; i < N; i++)
{
// get the frequency of
// current element
let freq = (i + 1) * (N - i);
// Uncomment below line to print
// the frequency of arr[i]
// cout << arr[i] << " " << freq << endl;
// if frequency is odd, then
// include it in the result
if (freq % 2 == 1)
res = res ^ arr[i];
}
// return the result
return res;
}
// Driver Code
let arr = [3, 5, 2, 4, 6];
let N = arr.length;
document.write(getTotalXorOfSubarrayXors(arr, N));
</script>


输出:

7

时间复杂性: O(N) 本文由 乌特卡什·特里维迪 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享