N = gets.to_i A = gets.split.map(&:to_i) def dfs(nums, mb) return nums.max if mb == 0 return 0 if nums.empty? base = 1 << mb cand = nums.group_by { |x| x[mb] } cand.default = [] v = 0 if cand[0].size > 0 && cand[1].size > 0 v = [ dfs(cand[0].map { |x| x ^ base }, mb - 1), dfs(cand[1], mb - 1) ].max elsif cand[0].size > 0 v = dfs(cand[0], mb - 1) elsif cand[1].size > 0 v = dfs(cand[1].map { |x| x ^ base }, mb - 1) end v end mb = A.map(&:bit_length).max puts dfs(A, mb - 1)