Vampiric Powers, anyone? (Codeforces 1847C)
Tags: Greedy, bitmasks

DIO knows that the Stardust Crusaders have determined his location and will be coming to fight him. To foil their plans he decides to send out some Stand users to fight them. Initially, he summoned $$$n$$$ Stand users with him, the $$$i$$$-th one having a strength of $$$a_i$$$. Using his vampiric powers, he can do the following as many times as he wishes:  Let the current number of Stand users be $$$m$$$.  DIO chooses an index $$$i$$$ ($$$1 \le i \le m$$$).  Then he summons a new Stand user, with index $$$m+1$$$ and strength given by: $$$$$$a_{m+1} = a_i \oplus a_{i+1} \oplus \ldots \oplus a_m,$$$$$$where the operator $$$\oplus$$$ denotes the bitwise XOR operation.  Now, the number of Stand users becomes $$$m+1$$$. Unfortunately for DIO, by using Hermit Purple's divination powers, the Crusaders know that he is plotting this, and they also know the strengths of the original Stand users. Help the Crusaders find the maximum possible strength of a Stand user among all possible ways that DIO can summon.

Input: Each test contains multiple test cases. The first line contains the number of test cases $$$t$$$ ($$$1 \le t \le 10\,000$$$). The description of the test cases follows.The first line of each test case contains a single integer $$$n$$$ ($$$1 \le n \le 10^5$$$)  – the number of Stand users initially summoned.The second line of each test case contains $$$n$$$ integers $$$a_1, a_2, \ldots, a_n$$$ ($$$0 \le a_i < 2^8$$$)  – the strength of each Stand user.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$10^5$$$.

Output: For each test case, output a single integer, maximum strength of a Stand user among all possible ways that DIO can summon.

Note: In the first test case, one of the ways to add new Stand users is as follows: Choose $$$i=n$$$. Now, $$$a$$$ becomes $$$[0,2,5,1,1]$$$. Choose $$$i=1$$$. Now, $$$a$$$ becomes $$$[0,2,5,1,1,7]$$$. $$$7$$$ is the maximum strength of a Stand user DIO can summon.In the second test case, DIO does not need to add more Stand users because $$$3$$$ is the maximum strength of a Stand user DIO can summon. 

Sample Inputs:
3
4
0 2 5 1
3
1 2 3
5
8 2 4 12 1

Sample Outputs:
7
3
14

Solution (Python):
import math
import sys
from typing import List, Optional, Dict
from collections import defaultdict, deque
import bisect
input = sys.stdin.readline

def inp():
    return int(input())

def inlt():
    return list(map(int, input().split()))

def insr():
    s = input()
    return list(s[:len(s) - 1])

def invr():
    return map(int, input().split())

def out(v):
    sys.stdout.write(v)
t = inp()
for _ in range(t):
    n = inp()
    a = inlt()
    d = defaultdict(bool)
    b = 0
    res = max(a)
    if res == 0:
        out(f'{res}\n')
        continue
    maxRes = 2 ** (math.trunc(math.log2(res)) + 1) - 1
    d[0] = True
    for i in range(n - 1, -1, -1):
        b = b ^ a[i]
        if b in d:
            continue
        for k in d.keys():
            res = max(res, b ^ k)
        if res == maxRes:
            break
        d[b] = True
    out(f'{res}\n')

Solution (Python):
import math
import sys
from typing import List, Optional, Dict
from collections import defaultdict, deque
import bisect
input = sys.stdin.readline

def inp():
    return int(input())

def inlt():
    return list(map(int, input().split()))

def insr():
    s = input()
    return list(s[:len(s) - 1])

def invr():
    return map(int, input().split())

def out(v):
    sys.stdout.write(v)
t = inp()
for _ in range(t):
    n = inp()
    a = inlt()
    d = defaultdict(bool)
    b = 0
    res = max(a)
    if res == 0:
        out(f'{res}\n')
        continue
    maxRes = 2 ** (math.trunc(math.log2(res)) + 1) - 1
    d[0] = True
    for i in range(n - 1, -1, -1):
        b = b ^ a[i]
        if b in d:
            continue
        for k in d.keys():
            res = max(res, b ^ k)
        if res == maxRes:
            break
        d[b] = True
    out(f'{res}\n')

Solution (Python):
import math
import sys
from typing import List, Optional, Dict
from collections import defaultdict, deque
import bisect
input = sys.stdin.readline

def inp():
    return int(input())

def inlt():
    return list(map(int, input().split()))

def insr():
    s = input()
    return list(s[:len(s) - 1])

def invr():
    return map(int, input().split())

def out(v):
    sys.stdout.write(v)
t = inp()
for _ in range(t):
    n = inp()
    a = inlt()
    d = defaultdict(bool)
    b = 0
    res = max(a)
    if res == 0:
        out(f'{res}\n')
        continue
    maxRes = 2 ** (math.trunc(math.log2(res)) + 1) - 1
    d[0] = True
    for i in range(n - 1, -1, -1):
        b = b ^ a[i]
        if b in d:
            continue
        for k in d.keys():
            res = max(res, b ^ k)
        if res == maxRes:
            break
        d[b] = True
    out(f'{res}\n')