用哈希表维护二元组异或值。把四条报文校验码组成的四元组 (i,j,p,q) 拆成左右两对:
条件 ai⊕aj⊕ap⊕aq=k 等价于
安全运营中心在一次巡检中采集了 n 条设备心跳报文,第 i 条带有非负整数校验码 ai。审计手册规定:若能选出四个下标两两不同的报文,使其校验码按位异或恰好等于当天的目标指纹 k,则记为一组需复核的组合。为避免重复统计,四个下标必须按 i<j<p<q 计数。
请统计满足 ai⊕aj⊕ap⊕aq=k 的四元组个数。其中 ⊕ 表示按位异或:每一位上相同得 0、不同得 1。
约束:测试组数不超过 1000,单组长度满足 4≤n≤1000,所有组的 n 之和不超过 4000;k 与各校验码均不超过 1000000000。
每个测试文件包含多组数据。第一行一个整数 T,表示组数。 每组第一行两个整数 n 和 k,第二行 n 个整数 a1,a2,…,an。 保证 1≤T≤1000,4≤n≤1000,0≤k,ai≤1000000000,且所有组 ∑n≤4000。
输出 T 行,第 i 行给出第 i 组满足条件的四元组个数。
输入
2
4 7
3 5 6 7
6 0
8 8 4 4 2 2
输出
1
3
说明
第一组只有一个四元组,异或 3⊕5⊕6⊕7=‘7‘,等于目标,答案为 1。
第二组 k=‘0‘,序列为 8,8,4,4,2,2。满足 i<j<p<q 且四数异或为 0 的四元组共 3 个。
输入
1
4 1
9 9 9 9
输出
0
说明
四个 9 的异或为 0,不等于 k=‘1‘,答案为 0。
输入
1
5 0
0 0 0 0 0
输出
5
说明
n=‘5‘,k=‘0‘,全零数组任意四元组异或均为 0。四元组个数为 (45)=‘5‘。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.