1829. Maximum XOR for each query#
You are given a sorted array nums of n non-negative integers and an integer maximumBit. You want to perform the following query n times:
Find a non-negative integer k < 2maximumBit such that nums[0] XOR nums[1] XOR โฆ XOR nums[nums.length-1] XOR k is maximized. k is the answer to the ith query.
Remove the last element from the current array nums.
Return an array answer, where answer[i] is the answer to the ith query.
Example 1
Input: nums = [0,1,1,3], maximumBit = 2
Output: [0,3,2,3]
Explanation: The queries are answered as follows:
1st query: nums = [0,1,1,3], k = 0 since 0 XOR 1 XOR 1 XOR 3 XOR 0 = 3.
2nd query: nums = [0,1,1], k = 3 since 0 XOR 1 XOR 1 XOR 3 = 3.
3rd query: nums = [0,1], k = 2 since 0 XOR 1 XOR 2 = 3.
4th query: nums = [0], k = 3 since 0 XOR 3 = 3.
Example 2:
Input: nums = [2,3,4,7], maximumBit = 3
Output: [5,2,6,5]
Explanation: The queries are answered as follows:
1st query: nums = [2,3,4,7], k = 5 since 2 XOR 3 XOR 4 XOR 7 XOR 5 = 7.
2nd query: nums = [2,3,4], k = 2 since 2 XOR 3 XOR 4 XOR 2 = 7.
3rd query: nums = [2,3], k = 6 since 2 XOR 3 XOR 6 = 7.
4th query: nums = [2], k = 5 since 2 XOR 5 = 7.
Example 3:
Input: nums = [0,1,2,2,5,7], maximumBit = 3
Output: [4,3,6,4,6,7]
import os
import logging
import traceback
from typing import List
def get_logger(LEVEL: str = "INFO") -> logging.Logger:
logger = logging.getLogger("custom_logger")
logger.setLevel(getattr(logging, LEVEL.upper(), logging.INFO))
stream_handler = logging.StreamHandler()
formatter = logging.Formatter(fmt="[%(asctime)s %(levelname)s] %(message)s", datefmt="%Y/%m/%d %H:%M:%S")
stream_handler.setFormatter(formatter)
if logger.hasHandlers():
logger.handlers.clear()
logger.addHandler(stream_handler)
return logger
def sol(problem_num, func):
script_dir = os.getcwd() # os.path.dirname(os.path.abspath(__file__))
path = script_dir + f"\\txt\\{problem_num}" + ".txt"
try:
with open(path, "r") as getter:
line_count = 1
while True:
line = getter.readline()
if not line:
logger.info("EOF")
break
try:
inp1, inp2, oup = line.strip().split()
# TODO :input output fitting
inp = [list(map(int, inp1.split(","))), int(inp2.strip())]
oup = list(map(int, oup.split(",")))
result = func(*inp)
if result != oup:
raise ValueError(f"WRONG : {line}")
logger.info(f"{line_count} : {inp} --- {oup} {oup == result}")
line_count += 1
except Exception:
logger.error(traceback.format_exc())
logger.info(f"FINISHED WITH ERROR IN {line_count}")
break
except FileNotFoundError:
logger.error(f"File not found: {path}")
except Exception as e:
logger.error(f"Error opening file: {e}")
logger.error(traceback.format_exc())
class Solution:
def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
n = len(nums)
xorr = nums[0]
max_xor = (1 << maximumBit) - 1
for i in range(1, n):
xorr ^= nums[i]
ans = []
for i in range(n):
ans.append(xorr ^ max_xor)
xorr ^= nums[n - 1 - i]
return ans
problem_num = 1829
global logger
logger = get_logger("info")
solution_instance = Solution()
sol(problem_num, solution_instance.getMaximumXor)
[2024/11/08 16:03:36 INFO] 1 : [[0, 1, 1, 3], 2] --- [0, 3, 2, 3] True
[2024/11/08 16:03:36 INFO] 2 : [[2, 3, 4, 7], 3] --- [5, 2, 6, 5] True
[2024/11/08 16:03:36 INFO] 3 : [[0, 1, 2, 2, 5, 7], 3] --- [4, 3, 6, 4, 6, 7] True
[2024/11/08 16:03:36 INFO] EOF