整数値を含む配列 Arr[] を取得します。目標は、XOR が 0 であるサブ配列の最大数を見つけることです。サブ配列のビットは何度でも交換できます。
注:- 118
ビットを交換してサブ配列の XOR を 0 にするには、2 つの条件を満たす必要があります:-
−Arr[] = { 1,2,5,4 }
Out−最初の条件を満たすサブ配列のみ: 4
2 つの条件を満たすサブ配列: 3
In− Arr[] = { 3,7,2,9 }#Out
−最初の条件のみを満たすサブ配列条件: 6
両方の条件を満たすサブ配列: 3以下のプログラム内 使用する方法は次のとおりです -このメソッドでは、ビットを交換してサブ配列の XOR を 0 にするには、2 つの条件を満たす必要があることがわかります。- 範囲が左から右に設定されている場合、桁数は偶数、または任意の範囲の桁の合計入力配列 Arr[] を取得し、その長さを計算します。
#結果を印刷します。
ここで、result=result - RemoveSubarr( arr1, len1) で結果を更新します。
結果には、両方の条件を満たす部分配列が含まれます。
#include <bits/stdc++.h> using namespace std; // Function to count subarrays not satisfying condition 2 int removeSubarr(int arr[], int len){ int count = 0; for (int i = 0; i < len; i++){ int sum = 0; int maxVal = 0; for (int j = i; j < min(len, i + 60); j++){ sum = sum + arr[j]; maxVal = arr[j] > maxVal ? arr[j]: maxVal; if (sum % 2 == 0){ if( 2 * maxVal > sum) { count++; } } } } return count; } int findSubarrays(int arr1[], int len1){ int prefix[len1]; int oddcount, evencount; int result; for (int i = 0; i < len1; i++) { arr1[i] = __builtin_popcountll(arr1[i]); } for (int i = 0; i < len1; i++){ prefix[i] = arr1[i]; if (i != 0) { prefix[i] = prefix[i] + prefix[i - 1]; } } oddcount = evencount = 0; for (int i = 0; i < len1; i++){ if (prefix[i] % 2 == 0) { evencount = evencount +1; } else { oddcount = oddcount +1; } } evencount++; int tmp1= ( oddcount * (oddcount-1) )/2; int tmp2= ( evencount * (evencount-1) )/2; result = tmp1+tmp2; cout << "Subarrays satisfying only 1st condition : "<<result << endl; cout << "Subarrays satisfying both condition : "; result = result - removeSubarr(arr1, len1); return result; } int main() { int Arr[] = { 1,2,5,4 }; int length = sizeof(Arr) / sizeof(Arr[0]); cout << findSubarrays(Arr, length); return 0; }
Subarrays satisfying only 1st condition : 4 Subarrays satisfying both condition : 3
以上がC++ では、ゼロ XOR を使用してサブ配列の数を最大化します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。