关于所有子数组的异或

给定一个数组 A. 属于 N 整数,比如A 1. A. 2. A. 3. ,…,A N .你得到了 Q 表格查询 [l,r] .任务是找到一个数组中元素为A的所有子数组的异或的异或 L A. l+1 , ….., A. R . 例如:

null
Input : A[] = { 1, 2, 3, 4, 5 }, Q = 3        q1 = { 1, 2 }        q2 = { 1, 3 }        q3 = { 2, 4 }Output : 0         2         6For query 1, the extracted array is [1, 2] and subarrays of the array is [1], [2], [1, 2]. So, the answer is (1) ⊕  (2) ⊕  (1 ⊕ 2) = 0.For query 2, the extracted array is [1, 2, 3] and subarrays of the array is[1], [2], [1, 2], [2, 3], [1, 2, 3]. So the answer is (1) ⊕  (2) ⊕  (3) ⊕ (1 ⊕  2) ⊕                   (2 ⊕  3) ⊕  (1 ⊕  2 ⊕  3) = 2.For query 3, the extracted array is [2, 3, 4] and subarrays of the array is [2], [3], [4], [2, 3], [3, 4], [2, 3, 4].So the answer is (2) ⊕ (3) ⊕  (4) ⊕  (2 ⊕  3) ⊕                   (3 ⊕  4) ⊕  (2 ⊕  3 ⊕  4) = 6.Input : A[] = { 5, 8, 9, 1, 7 }, Q = 3        query1 = { 1, 3 }        query2 = { 3, 4 }        query3 = { 2, 5 }Output : 12         0         0

首先回顾一下XOR的特性, 1.x⊕ x=0 2.如果x⊕ y=z,然后x=y⊕ Z 使用第一个属性,我们可以说任意数x或偶数次将得到0,奇数次将得到x。 如果我们想找到一个数组的所有子数组的异或的异或,我们需要找到在所有子数组中出现奇数次的元素。 假设我们有一个数组[1,2,3]。它的子阵列将是[1]、[2]、[3]、[1,2]、[2,3]、[1,2,3]。 总共发生了三次。 共发生4次。 共发生三次。 我们可以在第一时间观察到这个数字 th 索引将具有(i+1)x(sizeofarray–i)频率。 如果一个数组有奇数个整数,从第一个元素开始,每个替换元素在所有子数组中总共出现奇数次。因此,所有子阵列的异或的异或将是阵列中替代元素的异或。 如果一个数组有偶数个整数,那么每个元素在所有子数组中总共出现偶数次。因此,所有子阵列的异或的异或将始终为0。 为每个查询遍历数组效率很低。我们可以通过使用递归将XOR值与替换元素进行XOR运算,将XOR值存储到每个元素 前缀_xor[i]=A[i]⊕ 前缀_xor[i–2] 对于每个查询,起始索引为l,结束索引为r。如果(r–l+1)为奇数,答案将是前缀_xor[r]⊕ 前缀_xor[l–2]。 以下是该方法的实施情况:

C++

// CPP Program to answer queries on XOR of XORs
// of all subarray
#include <bits/stdc++.h>
#define N 100
using namespace std;
// Output for each query
void ansQueries( int prefeven[], int prefodd[],
int l, int r)
{
// If number of element is even.
if ((r - l + 1) % 2 == 0)
cout << "0" ;
// If number of element is odd.
else {
// if l is even
if (l % 2 == 0)
cout << (prefeven[r] ^ prefeven[l - 1]);
// if l is odd
else
cout << (prefodd[r] ^ prefodd[l - 1]);
}
cout << endl;
}
// Wrapper Function
void wrapper( int arr[], int n, int l[], int r[], int q)
{
int prefodd[N] = { 0 }, prefeven[N] = { 0 };
// Evaluating prefixodd and prefixeven
for ( int i = 1; i <= n; i++) {
if ((i) % 2 == 0) {
prefeven[i] = arr[i - 1] ^ prefeven[i - 1];
prefodd[i] = prefodd[i - 1];
}
else {
prefeven[i] = prefeven[i - 1];
prefodd[i] = prefodd[i - 1] ^ arr[i - 1];
}
}
int i = 0;
while (i != q) {
query(prefeven, prefodd, l[i], r[i]);
i++;
}
}
// Driven Program
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int n = sizeof (arr) / sizeof (arr[0]);
int l[] = { 1, 1, 2 };
int r[] = { 2, 3, 4 };
int q = sizeof (l) / sizeof (l[0]);
ansQueries(arr, n, l, r, q);
return 0;
}


JAVA

// JAVA Code for Queries on XOR
// of XORs of all subarrays
import java.util.*;
class GFG {
// Output for each query
static void ansQueries( int prefeven[],
int prefodd[],
int l, int r)
{
// If number of element is even.
if ((r - l + 1 ) % 2 == 0 )
System.out.println( "0" );
// If number of element is odd.
else
{
// if l is even
if (l % 2 == 0 )
System.out.println(prefeven[r] ^
prefeven[l - 1 ]);
// if l is odd
else
System.out.println(prefodd[r] ^
prefodd[l - 1 ]);
}
}
// Wrapper Function
static void wrapper( int arr[], int n,
int l[], int r[],
int q)
{
int prefodd[] = new int [ 100 ];
int prefeven[] = new int [ 100 ];
// Evaluating prefixodd
// and prefixeven
for ( int i = 1 ; i <= n; i++) {
if ((i) % 2 == 0 ) {
prefeven[i] = arr[i - 1 ] ^
prefeven[i - 1 ];
prefodd[i] = prefodd[i - 1 ];
}
else
{
prefeven[i] = prefeven[i - 1 ];
prefodd[i] = prefodd[i - 1 ] ^
arr[i - 1 ];
}
}
int i = 0 ;
while (i != q){
ansQueries(prefeven, prefodd,
l[i], r[i]);
i++;
}
}
/* Driver program to test above function */
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 };
int n = arr.length;
int l[] = { 1 , 1 , 2 };
int r[] = { 2 , 3 , 4 };
int q = l.length;
wrapper(arr, n, l, r, q);
}
}
// This code is contributed by Arnav Kr. Mandal.


Python 3

# Python 3 Program to answer queries on
# XOR of XORs of all subarray
N = 100
# Output for each query
def ansQueries(prefeven, prefodd, l, r):
# If number of element is even.
if ((r - l + 1 ) % 2 = = 0 ):
print ( "0" )
# If number of element is odd.
else :
# if l is even
if (l % 2 = = 0 ):
print (prefeven[r] ^
prefeven[l - 1 ])
# if l is odd
else :
print (prefodd[r] ^
prefodd[l - 1 ])
# Wrapper Function
def wrapper(arr, n, l, r, q):
prefodd = [ 0 ] * N
prefeven = [ 0 ] * N
# Evaluating prefixodd and prefixeven
for i in range ( 1 , n + 1 ) :
if ((i) % 2 = = 0 ) :
prefeven[i] = arr[i - 1 ] ^ prefeven[i - 1 ]
prefodd[i] = prefodd[i - 1 ]
else :
prefeven[i] = prefeven[i - 1 ]
prefodd[i] = prefodd[i - 1 ] ^ arr[i - 1 ]
i = 0
while (i ! = q) :
ansQueries(prefeven, prefodd, l[i], r[i])
i + = 1
# Driver Code
if __name__ = = "__main__" :
arr = [ 1 , 2 , 3 , 4 , 5 ]
n = len (arr)
l = [ 1 , 1 , 2 ]
r = [ 2 , 3 , 4 ]
q = len (l)
wrapper(arr, n, l, r, q)
# This code is contributed by ita_c


C#

// C# code for Queries on XOR
// of XORs of all subarrays
using System;
class GFG {
// Output for each query
static void ansQueries( int [] prefeven,
int [] prefodd,
int l, int r)
{
// If number of element is even.
if ((r - l + 1) % 2 == 0)
Console.WriteLine( "0" );
// If number of element is odd.
else {
// if l is even
if (l % 2 == 0)
Console.WriteLine(prefeven[r] ^ prefeven[l - 1]);
// if l is odd
else
Console.WriteLine(prefodd[r] ^ prefodd[l - 1]);
}
}
// Wrapper Function
static void wrapper( int [] arr, int n,
int [] l, int [] r,
int q)
{
int [] prefodd = new int [100];
int [] prefeven = new int [100];
// Evaluating prefixodd
// and prefixeven
for ( int i = 1; i <= n; i++) {
if ((i) % 2 == 0) {
prefeven[i] = arr[i - 1] ^ prefeven[i - 1];
prefodd[i] = prefodd[i - 1];
}
else {
prefeven[i] = prefeven[i - 1];
prefodd[i] = prefodd[i - 1] ^ arr[i - 1];
}
}
int j = 0;
while (j != q) {
ansQueries(prefeven, prefodd,
l[j], r[j]);
j++;
}
}
/* Driver program to test above function */
public static void Main()
{
int [] arr = { 1, 2, 3, 4, 5 };
int n = arr.Length;
int [] l = { 1, 1, 2 };
int [] r = { 2, 3, 4 };
int q = l.Length;
wrapper(arr, n, l, r, q);
}
}
// This code is contributed by vt_m.


PHP

<?php
// php Program to answer
// queries on XOR of XORs
// of all subarray
// Output for each query
function ansQueries( $prefeven , $prefodd ,
$l , $r )
{
// If number of element is even.
if (( $r - $l + 1) % 2 == 0)
{
echo "0" ;
}
// If number of element is odd.
else {
// if l is even
if ( $l % 2 == 0)
echo ( $prefeven [ $r ] ^
$prefeven [ $l - 1]);
// if l is odd
else
echo ( $prefodd [ $r ] ^
$prefodd [ $l - 1]);
}
echo "" ;
}
// Wrapper Function
function wrapper( array $arr , $n , array $l ,
array $r , $q )
{
$prefodd = array_fill (0,100,0);
$prefeven = array_fill (0,100,0);
// Evaluating prefixodd
// and prefixeven
for ( $i = 1; $i <= $n ; $i ++)
{
if (( $i ) % 2 == 0)
{
$prefeven [ $i ] = $arr [ $i - 1] ^
$prefeven [ $i - 1];
$prefodd [ $i ] = $prefodd [ $i - 1];
}
else {
$prefeven [ $i ] = $prefeven [ $i - 1];
$prefodd [ $i ] = $prefodd [ $i - 1] ^
$arr [ $i - 1];
}
}
$i = 0;
while ( $i != $q ) {
ansQueries( $prefeven , $prefodd ,
$l [ $i ], $r [ $i ]);
$i ++;
}
}
// Driver code
$arr = array ( 1, 2, 3, 4, 5 );
$n = sizeof( $arr ) / sizeof( $arr [0]);
$l = array ( 1, 1, 2 );
$r = array ( 2, 3, 4 );
$q = sizeof( $l ) / sizeof( $l [0]);
wrapper( $arr , $n , $l , $r , $q );
// This code is contributed by mits
?>


Javascript

<script>
// JavaScript program for Queries on XOR
// of XORs of all subarrays
// Output for each query
function ansQueries(prefeven,
prefodd,
l, r)
{
// If number of element is even.
if ((r - l + 1) % 2 == 0)
document.write( "0" );
// If number of element is odd.
else
{
// if l is even
if (l % 2 == 0)
document.write(prefeven[r] ^
prefeven[l - 1]) ;
// if l is odd
else
document.write(prefodd[r] ^
prefodd[l - 1] );
}
document.write( "<br/>" );
}
// Wrapper Function
function wrapper(arr, n,
l, r, q)
{
let prefodd = [];
let prefeven = [];
// Evaluating prefixodd
// and prefixeven
for (let i = 1; i <= n; i++) {
if ((i) % 2 == 0) {
prefeven[i] = arr[i - 1] ^
prefeven[i - 1];
prefodd[i] = prefodd[i - 1];
}
else
{
prefeven[i] = prefeven[i - 1];
prefodd[i] = prefodd[i - 1] ^
arr[i - 1];
}
}
let i = 0;
while (i != q){
ansQueries(prefeven, prefodd,
l[i], r[i]);
i++;
}
}
// Driver code
let arr = [1, 2, 3, 4 , 5];
let n = arr.length;
let l = [1, 1, 2];
let r = [2, 3, 4];
let q = l.length;
wrapper(arr, n, l, r, q);
</script>


输出:

026

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