【发布时间】:2015-12-08 05:34:39
【问题描述】:
给定一个长度为n 的数组arr,找出有多少arr 的子集使得这些子集中的XOR(^) 等于给定的数字ans。
我有这种dp 方法,但有没有办法提高它的时间复杂度。 ans 总是小于 1024。
这里ans 是第。这样子集的XOR(^) 等于它。
arr[n] 包含所有数字
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(i = 1; i <= n; i++){
for(j = 0; j < 1024; j++) {
dp[i][j] = (dp[i-1][j] + dp[i-1][j^arr[i]]);
}
}
cout << (dp[n][ans]);
【问题讨论】:
-
你的问题不够清楚。
-
dp是正确的方法。您面临的问题是什么? -
@MohitJain 如何提高它的时间复杂度
-
我得到 TLE。 N 的数量级为 10^5。
-
那么您似乎应该能够利用输入数组中的重复。假设输入有 10^5 个数字,但只有 10^3 个唯一值是可能的,那么平均每个值在输入中出现 100 次。 XOR 的特性之一是,将一个数与自身异或偶数次产生 0,奇数次产生该数。结合这两个观察结果,您应该能够大大加快速度。
标签: c++ algorithm bit-manipulation dynamic-programming