给定两个数组A []和B []分别具有N和M个正元素。任务是用数组B中每个元素的XOR中的偶数个设置位来计数数组A中的元素数量。
例子:
Input: A[] = { 4, 2, 15, 9, 8, 8 }, B[] = { 3, 4, 22 }
Output: 2 4 4
Explanation:
Binary representation of elements of A are : 100, 10, 1111, 1001, 1000, 1000
Binary representation of elements of B are : 11, 101, 10110
Now for element 3(11),
3^4 = 11^100 = 111
3^2 = 11^10 = 01
3^15 = 11^1111 = 1100
3^9 = 11^1001 = 1111
3^8 = 11^1000 = 1011
3^8 = 11^1000 = 1011
Only 2 elements {15, 9} in A[] are there for element 3 such that count of set bit after XOR is even. So the count is 2.
Similarly, Count for element 4 and 22 is 4.
Input: A[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, B[] = { 4 }
Output: 5
Explanation:
The element in A[] such that count of set bit after XOR is even is {1, 2, 4, 7, 8}. So the count is 5.
天真的方法:这个想法是为数组B []中的每个元素与数组A []中的每个元素计算XOR,并对具有偶数置位的数字进行计数。
时间复杂度: O(N * M),其中N和M分别是数组A []和B []的长度。
高效方法:想法是使用XOR的属性。对于任何两个数字,如果两个数字的设置位计数是偶数或奇数,则两个数字的XOR之后的设置位计数是偶数。
以下是基于上述属性的步骤:
- 计算数组A []中具有偶数(例如a )和奇数(例如b )设置位的元素数。
- 对于数组B []中的每个元素:
- 如果当前元素具有置位偶数,则数组A []中与当前元素进行异或的位数为a 。
- 如果当前元素的设置位数为奇数,则数组A []中与当前元素进行异或的位数为b 。
下面是上述方法的实现:
CPP
// C++ program for the above approach
#include
using namespace std;
// Function that count the XOR of B[]
// with all the element in A[] having
// even set bit
void countEvenBit(int A[], int B[], int n, int m)
{
int i, j, cntOdd = 0, cntEven = 0;
for (i = 0; i < n; i++) {
// Count the set bits in A[i]
int x = __builtin_popcount(A[i]);
// check for even or Odd
if (x & 1) {
cntEven++;
}
else {
cntOdd++;
}
}
// To store the count of element for
// B[] such that XOR with all the
// element in A[] having even set bit
int CountB[m];
for (i = 0; i < m; i++) {
// Count set bit for B[i]
int x = __builtin_popcount(B[i]);
// check for Even or Odd
if (x & 1) {
CountB[i] = cntEven;
}
else {
CountB[i] = cntOdd;
}
}
for (i = 0; i < m; i++) {
cout << CountB[i] << ' ';
}
}
// Driver Code
int main()
{
int A[] = { 4, 2, 15, 9, 8, 8 };
int B[] = { 3, 4, 22 };
countEvenBit(A, B, 6, 3);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Function that count the XOR of B[]
// with all the element in A[] having
// even set bit
static void countEvenBit(int A[], int B[], int n, int m)
{
int i, j, cntOdd = 0, cntEven = 0;
for (i = 0; i < n; i++) {
// Count the set bits in A[i]
int x = Integer.bitCount(A[i]);
// check for even or Odd
if (x % 2 == 1) {
cntEven++;
}
else {
cntOdd++;
}
}
// To store the count of element for
// B[] such that XOR with all the
// element in A[] having even set bit
int []CountB = new int[m];
for (i = 0; i < m; i++) {
// Count set bit for B[i]
int x = Integer.bitCount(B[i]);
// check for Even or Odd
if (x%2 == 1) {
CountB[i] = cntEven;
}
else {
CountB[i] = cntOdd;
}
}
for (i = 0; i < m; i++) {
System.out.print(CountB[i] +" ");
}
}
// Driver Code
public static void main(String[] args)
{
int A[] = { 4, 2, 15, 9, 8, 8 };
int B[] = { 3, 4, 22 };
countEvenBit(A, B, 6, 3);
}
}
// This code is contributed by sapnasingh4991
Python3
# Python3 program for the above approach
# Function that count the XOR of B
# with all the element in A having
# even set bit
def countEvenBit(A, B, n, m):
i, j, cntOdd = 0, 0, 0
cntEven = 0
for i in range(n):
# Count the set bits in A[i]
x = bin(A[i])[2:].count('1')
# check for even or Odd
if (x & 1):
cntEven += 1
else :
cntOdd += 1
# To store the count of element for
# B such that XOR with all the
# element in A having even set bit
CountB = [0]*m
for i in range(m):
# Count set bit for B[i]
x = bin(B[i])[2:].count('1')
# check for Even or Odd
if (x & 1):
CountB[i] = cntEven
else:
CountB[i] = cntOdd
for i in range(m):
print(CountB[i], end=" ")
# Driver Code
if __name__ == '__main__':
A = [ 4, 2, 15, 9, 8, 8]
B = [ 3, 4, 22 ]
countEvenBit(A, B, 6, 3)
# This code is contributed by mohit kumar 29
C#
// C# program for the above approach
using System;
class GFG{
// Function that count the XOR of []B
// with all the element in []A having
// even set bit
static void countEvenBit(int []A, int []B, int n, int m)
{
int i, cntOdd = 0, cntEven = 0;
for (i = 0; i < n; i++)
{
// Count the set bits in A[i]
int x = bitCount(A[i]);
// check for even or Odd
if (x % 2 == 1) {
cntEven++;
}
else {
cntOdd++;
}
}
// To store the count of element for
// []B such that XOR with all the
// element in []A having even set bit
int []CountB = new int[m];
for (i = 0; i < m; i++) {
// Count set bit for B[i]
int x = bitCount(B[i]);
// check for Even or Odd
if (x % 2 == 1) {
CountB[i] = cntEven;
}
else {
CountB[i] = cntOdd;
}
}
for (i = 0; i < m; i++) {
Console.Write(CountB[i] +" ");
}
}
static int bitCount(int x)
{
int setBits = 0;
while (x != 0) {
x = x & (x - 1);
setBits++;
}
return setBits;
}
// Driver Code
public static void Main(String[] args)
{
int []A = { 4, 2, 15, 9, 8, 8 };
int []B = { 3, 4, 22 };
countEvenBit(A, B, 6, 3);
}
}
// This code is contributed by Rajput-Ji
2 4 4
时间复杂度: O(N + M),其中N和M分别是给定两个数组的长度。