我參加了一個算法競賽。我陷入了一個問題,我在這裏也一樣問。添加每個可能的xor-sum子陣列的總和的算法
問題陳述
XOR求和陣列是進行XOR該子陣列的所有的數字。 給你一個數組,你必須添加所有可能的這種異或子數組。
爲了更好地理解,問題陳述也是here。
例
輸入
陣列: - 1 2
輸出: - 6
說明
F(1, 1) = A[1] = 1
, F(2, 2) = A[2] = 2
和 F(1, 2) = A[1] XOR A[2] = 1 XOR 2 = 3.
因此答案是1 + 2 + 3 = 6。
我的代碼
時間複雜度: - O(N^2),(一個低效,並沒有在比賽中accpted)
#include<iostream>
using namespace std;
long long int input[100001];
main() {
int T;
int N;
long long int val;
long long int temp = 0;
long long int answer = 0;
cin >> T;
while(T--) {
cin >> N;
for(int i = 0; i < N; i++) {
cin >> val;
temp = temp^val;
answer += temp;
input[i] = temp;
}
for(int i = 0; i < N; i++) {
for(int j = i+1; j < N; j++) {
answer += input[i]^input[j];
}
}
cout << answer << endl;
answer = 0;
temp = 0;
}
return 0;
}
問題: -
我看到this link
這個問題的最佳解決方案,但在此代碼,我不明白以下模塊,請幫我理解這一點。
for (int i=0, p=1; i<30; i++, p<<=1) {
int c=0;
for (int j=0; j<=N; j++) {
if (A[j]&p) c++;
}
ret+=(long long)c*(N-c+1)*p;
}
在此先感謝。尋找你的迴應。
我認爲你談論組合與替換,而不是每個可能的子陣列,這將是一個powerset – aaronman
我不知道,但我認爲在這個問題,你將不得不使用的屬性,a^b = a + b沒有攜帶。 –
@aaronman我在計算機科學質量保證網站首先發布了這個問題,但有人說我在這裏發帖, 鏈接: - http://cs.stackexchange.com/questions/18194/algorithm-to-add-sum-of- every-possible-xor-sum-sub-array – devsda