Related
In following contests:
塔子哥有一个长度为n的数组a,他想知道有多少对{ai,aj,ak,al},(i<j<k<l)满足ai+aj=ak⊕al
给定一个长度为n的数组数组a,求有多少对{ai,aj,ak,al},(i<j<k<l)满足ai+aj=ak⊕al
本题很容易想到用四重循环去枚举应当选取哪些数并计算符合要求的对数,但是n≤10000,而这种方法的时间复杂度是O(N4),显然是不能够满足要求的。
我们可以发现,i,j,k,l需要满足严格的大小关系,同时,在O(N2)的处理下,我们可以得到所有对子ai+aj的值以及ak⊕al的值,并通过哈希来存储每个对子出现了多少次。所以我们可以尝试去隔断aj与ak,将数组分为两部分去计算答案。
具体来说,当我们预处理出所有对子ak⊕al的值时,我们从小到大枚举j,那么剩余的aj+1~an对应的ak⊕al已经预处理好了,我们可以再枚举i(1≤i<j)来计算ai+aj,而其和所对应的ak⊕al已经通过哈希预处理好,直接累加即可。当j枚举+1前,则需要在预处理中去掉aj⊕{aj+1,aj+2,...,an},这个操作的时间复杂度是O(N)的。
In following contests: