Dee*_*mar 4 algorithm xor subsequence
我试图解决这个问题,我们必须找到子序列的最大长度,使得每个连续元素的 XOR 等于 keg :Array = [3,2,4,3,5] 和 k=1。答案是 3。 subsequence = [3,2,3]
到目前为止,我已经尝试过这些方法:
int finalAns=0;
loop (i=0...n):
int xortillnow = array[i], count=1; // since we have already selected one element
loop(j=i+1..n):
if((xortillnow ^ array[i])==k):
count++;
xortillnow = xortillnow ^ array[i];
finalAns = max(count,finalAns);
Run Code Online (Sandbox Code Playgroud)
2.Second 我正在考虑动态编程,我可以在其中存储已经计算出的子序列的异或,但我无法完成算法。
有人可以告诉一些解决这个问题的其他方法。
XOR 运算符有一个很好的特性,对于任何值 x,只有一个值 y,其中 x ? y = k。具体来说,该值 y 由 x 给出?k,因为
(x ? k) ? k = x ? (k ? k) = x ? 0 = x。
所以想象一下从左到右扫描数组。每次看到一个新元素时,它都可以
这为这个问题提供了一个相对简单的算法。维护一个哈希表或 BST 将先前看到的值映射到子序列的最大长度,该属性以该值结束。从左到右扫描整个阵列。对于每个元素 x,计算 x ? k 并检查它是否在表中。如果是这样,记录 x 的长度为 m + 1,其中 m 是为 x 存储的长度?克。如果不是,记录 x 的长度为 1。
这需要使用 BST 的确定性时间 O(n log n) 和使用哈希表的预期时间 O(n)。