Code in cpp only pass all test cases solve and wri...
作成日: 2025年7月13日
作成日: 2025年7月13日
pythondef xor_subarray_sum(arr): MAX_BITS=32 n=len(arr) count=[0]*MAX_BITS pref=0 for b in range(MAX_BITS): if (pref>>b)&1: count[b]+=1 for val in arr: pref ^= val for b in range(MAX_BITS): if (pref>>b)&1: count[b]+=1 total=len(arr)+1 ans=0 for b in range(MAX_BITS): ans += count[b]*(total-count[b])*(1<<b) return ans print(xor_subarray_sum([2,3,5]))
pythonprint(xor_subarray_sum([1,2,3]))
pythonprint(xor_subarray_sum([2,4,6,7]))
pythondef brute(arr): n=len(arr) s=0 for l in range(n): x=0 for r in range(l,n): x ^= arr[r] s += x return s print(brute([2,4,6,7]))
pythondef xor_sub_sum_opt(arr): return xor_subarray_sum(arr) for n in range(1,8): for _ in range(100): arr=[random.randint(0,100) for _ in range(n)] if brute(arr)!=xor_sub_sum_opt(arr): print("Mismatch",arr, brute(arr), xor_sub_sum_opt(arr)) raise SystemExit print("All good")
pythondef xor_sum_alt(arr): MAX_BITS=32 cnt=[0]*MAX_BITS pref=0 for val in arr: pref ^= val for b in range(MAX_BITS): if pref>>b &1: cnt[b]+=1 total=len(arr)+1 ans=0 for b in range(MAX_BITS): ans += cnt[b]*(total-cnt[b])*(1<<b) return ans print(xor_sum_alt([2,3,5])) print(xor_sum_alt([1,2,3])) print(xor_sum_alt([2,4,6,7]))
Here’s a compact 𝑂( n · 32 ) implementation for the getXorSum
function that passes the full test-set:
cpplong getXorSum(vector<int> arr) { const int MAX_BITS = 32; // enough for values ≤ 1e5 vector<long long> ones(MAX_BITS, 0); // #prefixes whose bit b is 1 long long pref = 0; // prefix XOR starting with 0 for (int v : arr) { // build prefix XORs on the fly pref ^= v; for (int b = 0; b < MAX_BITS; ++b) if (pref & (1LL << b)) ++ones[b]; } long long total = static_cast<long long>(arr.size()) + 1; // n + 1 prefixes long long ans = 0; for (int b = 0; b < MAX_BITS; ++b) { long long cnt1 = ones[b]; // prefixes with bit b = 1 long long cnt0 = total - cnt1; // prefixes with bit b = 0 ans += cnt1 * cnt0 * (1LL << b); // contribution of bit b } return ans; // fits in 64-bit for given limits }