N 個の整数の配列と Q 個の範囲クエリがあるとします。各クエリについて、範囲内の各数値の最大の奇数の XOR を返す必要があります。
最大奇数とは、数値 N を分割できる最大の奇数です (例: )。たとえば、6 の最大の奇数は 3 です。
Input: nums[ ] = { 3, 6, 7, 10 }, query[ ] = { { 0, 2 }, { 1, 3 } } Output: query1: 7 query2: 1 Explanation: greatest odd divisors of nums array are { 3, 3, 7, 5 }. For query 1 we need to find the XOR of indexes 0, 1, and 2 which is 7, and for query2 we need to find XOR of indexes 1, 2, and 3 which is 1.
まず、簡単な方法では、すべての配列要素の最大の奇数を見つける必要があります。次に、クエリの範囲に基づいて、範囲内の各要素の XOR を計算し、それを返す必要があります。
この問題を解決する効果的な方法は、毎回範囲内の各数値の代わりに、最大の奇数の除数を持つ配列を含むプレフィックス XOR 配列 prefix_XOR[] を作成することです。 XOR を計算し、prefix_XOR[R] - prefix_XOR[L-1] を返します。
プレフィックス XOR 配列は、各要素に前のすべての要素の XOR が含まれる配列です。
#include <bits/stdc++.h> using namespace std; int main(){ int nums[] = { 3, 6, 7, 10 }; int n = sizeof(nums) / sizeof(nums[0]); int prefix_XOR[n]; // creating an array // containing Greatest odd divisor of each element. for (int i = 0; i < n; i++) { while (nums[i] % 2 != 1) nums[i] /= 2; prefix_XOR[i] = nums[i]; } // changing prefix_XOR array to prefix xor array. for (int i = 1; i < n; i++) prefix_XOR[i] = prefix_XOR[i - 1] ^ prefix_XOR[i]; // query array to find result of these queries. int query[2][2] = {{0, 2},{1, 3}}; int q = sizeof(query) / sizeof(query[0]); // finding results of queries. for(int i = 0;i<q;i++){ if (query[i][0] == 0) cout<< prefix_XOR[query[i][1]] << endl; else{ int result = prefix_XOR[query[0][1]] ^ prefix_XOR[query[i][0] - 1]; cout << result << endl; } } return 0; }
7 4
prefix_XOR配列を作成して、次の最大の奇数を格納します。次に、この配列をプレフィックス XOR 配列に変更します。
以上がC++ の範囲内の最大奇数除数を求める XOR クエリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。