Algorithm to add sum of every possible xor-sum sub-array

后端 未结 3 858
小蘑菇
小蘑菇 2021-02-06 13:36

I participated in one algorithmic competition. I got stuck in one problem, I am asking the same here.

Problem Statement

XOR-sum array is to XOR

3条回答
  •  一个人的身影
    2021-02-06 14:04

    As far as I can tell, the code at the link that you provided is not the best solution, nor even a working solution. The code which you copied from that link seems to make sense, but previous to the copied code, when the values are read into A, they are XORed by the value read in before them:

    for (int i = 1; i <= N; i++)
    {
        scanf("%d", &A[i]);
        A[i] ^= A[i - 1];
    }
    

    ...meaning the following input:

    1
    4
    1 2 3 4
    

    ...gets stored into A like so:

    A[0]: 00000000000000000000000000000000 = 0
    A[1]: 00000000000000000000000000000001 = 1
    A[2]: 00000000000000000000000000000011 = 3
    A[3]: 00000000000000000000000000000000 = 0
    A[4]: 00000000000000000000000000000100 = 4
    

    For the previous input, the correct answer should be:

    F(1, 1) + F(1, 2) + F(2, 2) + F(1, 3) + F(2, 3) + F(3, 3) + F(1, 4) + F(2, 4) + F(3, 4) + F(4, 4)
    = 1 + 3 + 2 + 2 + 1 + 3 + 5 + 6 + 7 + 4
    = 34
    

    ...but here's what we get using the algorithm you posted as the "best one" (sum of c * (N - c + 1) * 2 ^ i from i = 0 to i = 29)

    2 * (4 - 2 + 1) * 1 + 1 * (4 - 1 + 1) * 2 + 1 * (4 - 1 + 1) * 4
    = 6 + 8 + 16
    = 30
    

    So it's off by four, and therefore isn't a working solution to the problem, let alone the best working solution.

    Note that if the values hadn't been XORed when they were read in, here's what would be in A:

    A[0]: 00000000000000000000000000000000 = 0
    A[1]: 00000000000000000000000000000001 = 1
    A[2]: 00000000000000000000000000000010 = 2
    A[3]: 00000000000000000000000000000011 = 3
    A[4]: 00000000000000000000000000000100 = 4
    

    So then the formula sum of c * (N - c + 1) * 2 ^ i from i = 0 to i = 29 would give:

    2 * (4 - 2 + 1) * 1 + 2 * (4 - 2 + 1) * 2 + 1 * (4 - 1 + 1) * 4
    = 6 + 12 + 16
    = 34
    

    ...which is the correct answer, according to the problem statement on the website you linked. I think this is why we've seen answers so far that agree with the code you posted - the code you posted makes sense, even if the preceding code (found at the page to which you linked) makes the entire program erroneous.

提交回复
热议问题