EternalFire's blog

By EternalFire, history, 6 years ago, In English

Given an array A consist of N integers (N <= 100000, 0 <= Ai <= sqrt(i) for 1 <= i <= N). Count the number of triple (i, j, k) such that i <= j <= k and (Ai xor Aj xor Ak) = 0.

I tried many approaches but I couldn't optimize my O(N^2) solution. Is there any efficient algorithm to solve this problem?

  • Vote: I like it
  • -6
  • Vote: I do not like it

»
6 years ago, # |
  Vote: I like it +15 Vote: I do not like it

We can improve complexity to due to . Calculate frequencies of the elements while going from left to right, considering the Ak element in the triple. Now, we need to find the number of pairs i, j such that . Now, in time we can traverse the frequencies, considering element Aj, assuming , and adding freqAj × freqAi for Ai < Aj (that way we will count each pair once). Case of Ak = 0 should be handled separately — . The actual running time will be slightly better than since we don't traverse all the frequencies every iteration.