Để lớn nhất thì cần tìm số bù của prefixXor thoaiBài này AC hơi cao hư cấu nhỉ, nhưng mà làm quen bit manipulation cũng không khó lắm
Python:class Solution: def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]: n = len(nums) xOr = 0 for num in nums: xOr = xOr ^ num maxK = 2**maximumBit ans = [] for i in range(n - 1, -1, -1): current = 0 currentK = maxK for j in range(32, -1, -1): if xOr >> j & 1 == 0 and 1 << j < currentK: currentK -= 1 << j current |= 1 << j ans.append(current) xOr ^= nums[i] return ans
=> Đã hiểu lí do, thế mà ko nghĩ ra cách đơn giản thế nghĩ hơi phức tạpPython:class Solution: def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]: n = len(nums) xOr = 0 for num in nums: xOr = xOr ^ num maxK = (1 << maximumBit) - 1 ans = [0]*n for i in range(n - 1, -1, -1): ans[n - i - 1] = maxK ^ xOr xOr ^= nums[i] return ans
Thì nay bài này có hai điều kiện sort với nhỏ hơn 2^ maxbit đều nhảm màBài hôm nay éo hiểu cho cái sorted property vào làm cái gì? lừa nhau à![]()
Lúc đầu mình code ko nhìn cái constrain này đó fen, nên cách của mình đúng cho mọi nums < 2*32 đó0 <= nums < 2maximumBit
Nếu nums bất kì thì cái cách xor với 2**max - 1 ko đúng. Phức tạp hơnThì nay bài này có hai điều kiện sort với nhỏ hơn 2^ maxbit đều nhảm mà
chứng minh kiểu gì thế bác?Nếu nums bất kì thì cái cách xor với 2**max - 1 ko đúng. Phức tạp hơn
Nên nhìn cái solution mình ko hiểu tại sao nó đúng cho tới khi nhìn tới cái constrain
a xor b =c <-> b = a xor cchứng minh kiểu gì thế bác?
Nums bất kỳ thì thím xor với max INT xong lấy và với 2<<max -1 thôi.Nếu nums bất kì thì cái cách xor với 2**max - 1 ko đúng. Phức tạp hơn
Nên nhìn cái solution mình ko hiểu tại sao nó đúng cho tới khi nhìn tới cái constrain
)class Solution(object):
def getMaximumXor(self, nums, maximumBit):
"""
:type nums: List[int]
:type maximumBit: int
:rtype: List[int]
"""
res = []
k = (1 << maximumBit) - 1
xor_all = reduce(lambda x,y: x^y, nums)
for i in range(len(nums)-1, -1, -1):
res.append(xor_all ^ k)
xor_all ^= nums[i]
return res
Vì nếu 1 num < 2**bit thì ở mỗi phép xOr chỉ có thể flips được tối đa tất cả các bit về 1, nghĩa là 2**maxBit - 1. Vì phép toán XOR nó chỉ cho phép flip bit.chứng minh kiểu gì thế bác?
Có thể tính prefix rồi lưu kết quả vào mảng ban đầu để trả vềlúc đầu không biết cứ tính lại xor_all sau mỗi lần xóa phần tử cuối, hóa ra chỉ cần xor với pt đó là xóa đc đi. a^a =0, x^0 = x => x^a = x ^a ^aPython:class Solution(object): def getMaximumXor(self, nums, maximumBit): """ :type nums: List[int] :type maximumBit: int :rtype: List[int] """ res = [] k = (1 << maximumBit) - 1 xor_all = reduce(lambda x,y: x^y, nums) for i in range(len(nums)-1, -1, -1): res.append(xor_all ^ k) xor_all ^= nums[i] return res

class Solution {
public:
vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
int acc = 0;
for (int n: nums) acc ^= n;
int exclude = 0;
vector<int> res;
for (int i = nums.size() - 1; i >= 0; i--) {
acc ^= exclude;
int k = 0;
int tmp = acc;
for (int j = 0; j < maximumBit; j++) {
if (tmp & 1)
k &= ~(1<<j);
else
k |= (1<<j);
tmp >>= 1;
}
res.push_back(k);
exclude = nums[i];
}
return res;
}
};
bài này có giải thật j đâuMấy bác nghĩ ra quả giải thuật hay thật, em làm là đếm số bit 1 ở từng vị trí, số k của mình phải thỏa mãn sao cho tổng số bit 1 ở từng vị trí luôn là số lẻ là được.
max là 11111111-1 , numsxor ^ k = max thì k = max ^ numsxor thôi màclass Solution {
public int[] getMaximumXor(int[] nums, int maximumBit) {
int n = nums.length;
int[] prefix = new int[n+1];
int[] res = new int[n];
for(int i=0;i<n;i++){
prefix[i+1] = prefix[i]^nums[i];
}
for(int i = n;i>0;i--){
int c = prefix[i];
int k = 0;
while(k<maximumBit) {
int x = (1- c & 1 ) << k;
res[n- i] += (1 - c & 1) << k;
c >>= 1;
k++;
}
}
return res;
}
}
class Solution {
public int[] getMaximumXor(int[] nums, int maximumBit) {
int n = nums.length;
int currXor = 0;
int[] res = new int[n];
int max = (1<<maximumBit) -1;
for(int i=0;i<n;i++){
currXor^=nums[i];
res[n-1-i] = currXor^max;
}
return res;
}
}
func getMaximumXor(nums []int, maximumBit int) []int {
n := len(nums)
result := make([]int, n)
maxNum := (1 << maximumBit) - 1
currXor := 0
for i := range nums {
currXor ^= nums[i]
}
for i := 0; i < n; i++ {
k := currXor ^ maxNum
result[i] = k
if i < n-1 {
currXor ^= nums[n-1-i]
}
}
return result
}
kém phần bit nên suy nghĩ nó tù thế đấy bác.bài này có giải thật j đâumax là 11111111-1 , numsxor ^ k = max thì k = max ^ numsxor thôi mà
class Solution {
func getMaximumXor(_ nums: [Int], _ maximumBit: Int) -> [Int] {
let max = (1 << maximumBit) - 1
var result:[Int] = []
var xor = 0
for num in nums {
xor ^= num
result.append(max^xor)
}
return Array(result.reversed())
}
}
Chỗ này chuẩn hơn nữa thì dùng -1 thay cho max INTNums bất kỳ thì thím xor với max INT xong lấy và với 2<<max -1 thôi.
Nói chung bài này constrain làm cho tính toán bit dễ hơn nhiều roài. Mình toàn làm r mới soi constraint)
