- Translate each rule into one explicit state update.
- Maintain the invariant after every processed item.
- Return the accumulated state once all relevant input has been handled.
Code notes
- 122 lines of Python from the credited upstream file subarrays-with-xor-at-least-k.py.
- The implementation visibly relies on sequence storage.
- No explicit loop blocks detected.
Complexity
Count the number and nesting of passes over the input, then include the maintained containers in the memory estimate.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
123 45class Solution(object):6 def countXorSubarrays(self, nums, k):7 """8 :type nums: List[int]9 :type k: int10 :rtype: int11 """12 class Trie(object):13 def __init__(self, bit_length):14 self.__lefts = [-1]*(1+(1+len(nums))*bit_length) 15 self.__rights = [-1]*(1+(1+len(nums))*bit_length)16 self.__cnts = [0]*(1+(1+len(nums))*bit_length)17 self.__i = 018 self.__new_node()19 self.__bit_length = bit_length20 21 def __new_node(self):22 self.__i += 123 return self.__i-124 25 def add(self, num):26 curr = 027 for i in reversed(xrange(self.__bit_length)):28 x = (num>>i)&129 if x == 0:30 if self.__lefts[curr] == -1:31 self.__lefts[curr] = self.__new_node()32 curr = self.__lefts[curr]33 else:34 if self.__rights[curr] == -1:35 self.__rights[curr] = self.__new_node()36 curr = self.__rights[curr]37 self.__cnts[curr] += 138 39 def query(self, prefix, k):40 result = curr = 041 for i in reversed(xrange(self.__bit_length)):42 t = (k>>i)&143 x = (prefix>>i)&144 if t == 0:45 tmp = self.__lefts[curr] if 1^x == 0 else self.__rights[curr]46 if tmp != -1:47 result += self.__cnts[tmp]48 curr = self.__lefts[curr] if t^x == 0 else self.__rights[curr]49 if curr == -1:50 break51 else:52 result += self.__cnts[curr]53 return result54 55 result = prefix = 056 mx = max(max(nums), k, 1)57 trie = Trie(mx.bit_length())58 trie.add(prefix)59 for x in nums:60 prefix ^= x61 result += trie.query(prefix, k)62 trie.add(prefix)63 return result64 65 66676869class Solution_TLE(object):70 def countXorSubarrays(self, nums, k):71 """72 :type nums: List[int]73 :type k: int74 :rtype: int75 """76 class Trie(object):77 def __init__(self, bit_length):78 self.__nodes = []79 self.__cnts = []80 self.__new_node()81 self.__bit_length = bit_length82 83 def __new_node(self):84 self.__nodes.append([-1]*2)85 self.__cnts.append(0)86 return len(self.__nodes)-187 88 def add(self, num):89 curr = 090 for i in reversed(xrange(self.__bit_length)):91 x = (num>>i)&192 if self.__nodes[curr][x] == -1:93 self.__nodes[curr][x] = self.__new_node()94 curr = self.__nodes[curr][x]95 self.__cnts[curr] += 196 97 def query(self, prefix, k):98 result = curr = 099 for i in reversed(xrange(self.__bit_length)):100 t = (k>>i)&1101 x = (prefix>>i)&1102 if t == 0:103 tmp = self.__nodes[curr][1^x]104 if tmp != -1:105 result += self.__cnts[tmp]106 curr = self.__nodes[curr][t^x]107 if curr == -1:108 break109 else:110 result += self.__cnts[curr]111 return result112 113 result = prefix = 0114 mx = max(max(nums), k, 1)115 trie = Trie(mx.bit_length())116 trie.add(prefix)117 for x in nums:118 prefix ^= x119 result += trie.query(prefix, k)120 trie.add(prefix)121 return result122