import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { int n = Integer.parseInt(sc.nextLine()); int[] arr = new int[n]; for (int i = 0; i < n; i++) { long m = Long.parseLong(sc.nextLine()); String str = sc.nextLine(); arr[i] = f5(str.split(" ")); } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } } private static int f5(String[] arr) { // 使用mao保存网络集合,key为网络范围,value为网络中的账号数量 Map<Long, Integer> netMap = new HashMap<>(); // 遍历账号 for (int i = 0; i < arr.length; i++) { // 当前账号 long account = Long.parseLong(arr[i]); // 当前网络范围等于当前账号 long netKey = account; // 定义集合用于临时存储需要移除的网络范围,减少循环数量 List<Long> removeNet = new ArrayList<>(); // 定义账号数量 int count = 1; // 遍历网络,判断当前账号是否在网络当中 for (Long net : netMap.keySet()) { if ((net & netKey) >= 1) { // 当前账号在网络中,使用按位或运算合并网络,将当前网络的范围扩大. netKey = netKey | net; // 当前网络的账号数量为,当前账号数量加上合并的网络中的账号数量 count = count + netMap.get(net); // 移除小范围的网络,减少后续遍历数量 removeNet.add(net); } } // 移除小范围的网络 removeNet.forEach(net -> netMap.remove(net)); // 添加当前网络范围到集合当中 netMap.put(netKey, count); } // 返回网络范围集合当中包含最多网络数量的值 return netMap.values().stream().max(Integer::compareTo).orElse(1); } }