计算相邻的xor

时间:2012-05-02 17:14:59

标签: c++ c algorithm xor

输入是一个布尔数组a_0,i,最多有1000,000个元素。

每次新数组由前一个数组中xor个相邻(循环)元素组成时:

a_t,i = a_t-1,i ^ a_t-1,(i+1)%n     // n is size of input

需要第p个数组(a_p,i)。(p <= 1000,000,000)。

根据p的上限,我想可能有一个数组结构,或者数组可以在O(lg(p) * n)中计算。

1 个答案:

答案 0 :(得分:2)

如果t是2的幂(t = 2 k ),

a_t,i = a_0,i ^ a_0,(i+t)%n

此外,如果t是两个分量的总和,其中一个是2的幂(t = v + w,w = 2 m ),

a_t,i = a_v,i ^ a_v,(i+w)%n

这允许使用p的二进制表示来递归地计算结果数组。复杂性按要求:O(lg(p)* n):

shift = 1;
while (p != 0)
{
  if (p&1)
    a ^= a.rotate(shift);
  shift *= 2
  p /= 2
}