1829. Maximum XOR for each query

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:

  1. 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.

  2. 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