超时了
def find(a): if p[a] != a: p[a] = find(p[a]) # 查找父节点 return p[a] def merge(a, b): # 合并两个集合 pa = find(a) pb = find(b) if pa != pb: p[pa] = pb si[pb] += si[pa] while True: try: T = int(input()) res = [] for _ in range(T): n = int(input()) w = list(map(int, input().split())) length = len(bin(max(w))[2:]) # 最长的二进制长度 w = [bin(i)[2:].rjust(length, '0') for i in w] # 权重都转换成二进制 p = list(range(n)) # 每个节点的父节点初始化为自己 si = [1] * n # 每个集合的大小初始化为1 for j in range(length): i = 0 while i < n and w[i][j] == '0': i += 1 # 在该列中第一个为1的节点做集合的初始父节点 # 如果后续还有1,将新节点合并进来做父节点,并更新集合长度 for k in range(i+1, n): if w[k][j] == '1': merge(k, i) ans = max(1, max(si)) res.append(ans) for i in res: print(i) except: break