C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のすべてのサブ配列のXORの合計


この問題では、n個の数の配列arr[]が与えられます。私たちのタスクは、配列のすべてのサブ配列のXORの合計を見つけるプログラムを作成することです。

ここでは、指定された配列のすべてのサブ配列を検索する必要があります。次に、各サブ配列について、要素のxorを検索し、XOR値を合計変数に追加します。

問題を理解するために例を見てみましょう

Input: arr[] = {5, 1, 4}
Output:
Explanation: XOR of all subarrays for the array :
XOR {5} = 5
XOR {1} = 1
XOR {4} = 4
XOR {5,1} = 5^1 = 4
XOR {1, 4} = 1^4 = 5
XOR {5, 1, 4} = 5^1^4 = 0
Sum = 5 + 1 + 4 + 4 + 5 + 0 = 19

この問題を解決する簡単な方法は、次のforループを使用してすべてのサブ配列を見つけることです。次に、サブ配列の要素のXORを見つけて、合計変数に追加します。

このソリューションは、ループのネストを使用するため効率的ではなく、時間計算量が指数関数的に複雑になります。

この問題を解決するための効率的なアプローチは、プレフィックス配列を使用することです。このプレフィックス配列は、iまで配列のすべての要素のxorを格納します。つまり、

prefixarr[i] = arr[0]^arr[1]^ … ^arr[i].

この後、簡単な式を適用して、インデックスiからjまでの要素のXORを見つけることができます。

XOR(i-j) = prefixarr[j] - prefixarr[i]for i >= 0.
If i = 0, XOR(i-j) = prefixarr[j]

この式を使用して、すべてのサブアレイのXORを見つけます。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
int calcSubArrayXORSum(int arr[], int n) {
   int sum = 0;
   int multiplier = 1;
   for (int i = 0; i < 30; i++) {
      int oddCount = 0;
      bool isOdd = 0;
      for (int j = 0; j < n; j++) {
         if ((arr[j] & (1 << i)) > 0)
            isOdd = (!isOdd);
         if (isOdd)
            oddCount++;
      }
      for (int j = 0; j < n; j++) {
         sum += (multiplier * oddCount);
         if ((arr[j] & (1 << i)) > 0)
            oddCount = (n - j - oddCount);
      }
      multiplier *= 2;
   }
   return sum;
}
int main() {
   int arr[] = { 3, 8, 13 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"Sum of XOR of all subarrays is "<<calcSubArrayXORSum(arr, n);
   return 0;
}

出力

Sum of XOR of all subarrays is 46

  1. C ++の配列のすべての要素にXOR演算を適用して、配列の合計を最小化する

    説明 サイズの配列が与えられた場合、N。Xと配列の各要素を使用してXOR演算を実行するときに、配列要素の合計が最小になるように要素Xを見つけます。 If input array is: arr [] = {8, 5, 7, 6, 9} then minimum sum will be 30 Binary representation of array elments are: 8 : 1000 5 : 0101 7 : 0111 6 : 0101 9 : 1001 If X = 5 then after performing XOR sum will be 30: 8 ^ 5 = 13 5

  2. C ++でのアリコートの合計?

    ここで、アリコートの合計は何ですか? nのアリコート和は、nを除くnのすべての完全な因子の合計です。たとえば、数値が20の場合、完全な因数は(1、2、4、5、10)です。したがって、アリコートの合計は22です。 興味深い事実の1つは、ある数のアリコートの合計がその数そのものである場合、その数は完全数であるということです。たとえば、6。係数は(1、2、3)です。アリコートの合計は1+2 + 3=6です。 次のアルゴリズムを使用してアリコートの合計を取得する方法を見てみましょう。 アルゴリズム getAliquotSum(n) begin    sum := 0 &nbs