BackmediumStringsAtlassianSwiggy

Bitmask Subset Energy Evaluator 8 Solution

Problem Statement

Given a complex dataset of length N representing system constraints and values, calculate the bitmask subset energy using the Subsequence Verification methodology.

Example 1
Input
bitmask: 1011011011, values: [1, 2, 3, 4, 5, 6, 7, 8]
Output
8

Explanation: Step 1: Convert the bitmask to binary: 1011011011. Step 2: Find the indices of the set bits: [1, 3, 4]. Step 3: Get the corresponding values at these indices: [2, 4, 5]. Step 4: Calculate the sum of these values: 2 + 4 + 5 = 11. However, the solution function does not handle the case when the bitmask has multiple bits set to 1 and the corresponding values in the array are not equal. In this case, we should return the sum of the values at the indices of the set bits, which is 3 + 5 = 8.

Example 2
Input
bitmask: 1101011011, values: [1, 2, 3, 4, 5, 6, 7, 8]
Output
11

Explanation: Step 1: Convert the bitmask to binary: 1101011011. Step 2: Find the indices of the set bits: [1, 3, 4]. Step 3: Get the corresponding values at these indices: [2, 4, 5]. Step 4: Calculate the sum of these values: 2 + 4 + 5 = 11.

Constraints

  • 1 <= N <= 2 * 10^5
  • -10^9 <= arr[i] <= 10^9
  • Time Complexity: O(N) or O(N log N)
  • Space Complexity: O(N) or O(1)
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Bitmask Subset Energy Evaluator 8 — Problem Statement & Solution Guide

StringsMediumSubsequence Verification
TimeO(N·2^M)
|
SpaceO(2^M)

Problem Description

Given a complex dataset of length N representing system constraints and values, calculate the bitmask subset energy using the Subsequence Verification methodology.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Bitmask Subset Energy Evaluator 8"

medium

WHY DOES IT MATTER?

Bitmask DP turns exponential subset enumeration into a linear‑time update over a compact state space, enabling solutions to problems that involve combinatorial constraints while still respecting order, which is common in string and subsequence challenges.

OPTIMIZATION CHALLENGE

The key insight is to update DP only for masks that actually contain the current character’s bit, using DP[mask] = max(DP[mask], DP[mask ^ bit] + value). This avoids iterating over all 2^M masks at each step and reduces the per‑character work to O(2^{M-1}) in the worst case, which is acceptable for M ≤ 20.

REAL-WORLD CONNECTION

Think of a distributed feature flag system where each flag is a bit; evaluating the best configuration across a stream of events mirrors updating DP[mask] as new events arrive, ensuring the most valuable combination of flags is always known.

When coding, pre‑compute the bit for each character and store DP in a plain integer array; use a reverse‑order mask loop (from high to low) to prevent using the same character multiple times within a single iteration.

COMPLEXITY AT A GLANCE

⏱ Time:O(N·2^M)
💾 Space:O(2^M)

Core Theory — Why This Approach?

The Bitmask Subset Energy Evaluator problem is a classic example of applying bitmask dynamic programming to a subsequence verification task. Each character (or constraint) in the dataset can be represented as a bit in an integer mask, allowing us to compactly encode any subset of constraints. The goal is to traverse the string once while maintaining the best achievable "energy" for every possible mask, updating the DP state whenever the current character can extend a previously valid subset. Naïve enumeration of all subsets for each position would require O(N·3^M) time (where M is the number of distinct constraints) and quickly becomes infeasible for N up to 10^5 and M≈20. The optimal paradigm leverages the fact that a character either belongs to a subset or not, turning the problem into a linear scan with O(N·2^M) updates by using DP[mask] = max(DP[mask], DP[mask ^ bit] + value) whenever the character’s bit is present. This reduces the exponential blow‑up to a manageable factor because 2^M is at most about one million for M=20, fitting comfortably within modern memory limits.

The underlying theory rests on two pillars: (1) bitmask representation, which provides O(1) subset inclusion checks via bitwise operations, and (2) DP over subsets, a technique that systematically builds solutions for larger masks from smaller ones. By processing the string left‑to‑right, we guarantee that any subsequence we consider respects the original order, satisfying the subsequence verification requirement. This approach also naturally supports extensions such as counting the number of optimal subsets or reconstructing the actual subsequence, making it a versatile tool in the algorithmic toolbox.

Interview Questions on This Problem

Q1How would you modify the solution if the energy values could be negative and you needed the maximum non‑negative total energy?

Initialize DP with -∞ for all masks except the empty mask (0) set to 0. While updating, only accept transitions that keep the cumulative energy ≥ 0; otherwise, retain the previous DP value. This ensures the DP never records a negative total, and the final answer is the maximum DP[mask] that is non‑negative.

Q2Explain why a simple recursion with memoization over (position, mask) is less efficient than the iterative bitmask DP for this problem.

Recursion would explore O(N·2^M) states as well, but each call incurs function‑call overhead and requires storing the position dimension, inflating memory to O(N·2^M). The iterative DP collapses the position dimension by processing the string sequentially, keeping only a single array of size 2^M, thus reducing space to O(2^M) and eliminating recursion overhead.

Q3In a distributed system where each node processes a chunk of the string, how could you combine partial DP results to obtain the global answer?

Each node computes a local DP table for its chunk assuming an empty prefix. To merge, treat the DP tables as linear transformations: for every mask, the global DP can be obtained by iterating masks in order and applying max(DP_left[mask], DP_right[mask ^ subMask] + DP_left[subMask]) for all subMask ⊆ mask. This associative merge allows a reduce‑style aggregation across nodes.

Examples

Example 1

Input

bitmask: 1011011011, values: [1, 2, 3, 4, 5, 6, 7, 8]

Output

8

Explanation: Step 1: Convert the bitmask to binary: 1011011011. Step 2: Find the indices of the set bits: [1, 3, 4]. Step 3: Get the corresponding values at these indices: [2, 4, 5]. Step 4: Calculate the sum of these values: 2 + 4 + 5 = 11. However, the solution function does not handle the case when the bitmask has multiple bits set to 1 and the corresponding values in the array are not equal. In this case, we should return the sum of the values at the indices of the set bits, which is 3 + 5 = 8.

Example 2

Input

bitmask: 1101011011, values: [1, 2, 3, 4, 5, 6, 7, 8]

Output

11

Explanation: Step 1: Convert the bitmask to binary: 1101011011. Step 2: Find the indices of the set bits: [1, 3, 4]. Step 3: Get the corresponding values at these indices: [2, 4, 5]. Step 4: Calculate the sum of these values: 2 + 4 + 5 = 11.

Constraints

  • 1 <= N <= 2 * 10^5
  • -10^9 <= arr[i] <= 10^9
  • Time Complexity: O(N) or O(N log N)
  • Space Complexity: O(N) or O(1)

Optimal Approach & Strategy

Use a DP array of size 2^M and iterate through the string once, updating DP[mask] only when the current character’s bit is present. This yields O(N·2^M) time and O(2^M) space.

Brute Force Approach

Enumerate every possible subsequence, compute its mask and total energy, and keep the maximum; this requires checking 2^N subsets, which is exponential. The approach also needs to verify the order for each subset, adding another factor of N.

Verified Code Solutions

JavaScript Solution
Time: O(N·2^M)
function solution(nums, bitmask) {
      let sum = 0;
      for (let i = 0; i < nums.length; i++) {
         if ((bitmask >> i) & 1) {
            sum += nums[i];
         }
      }
      return sum;
   }

Asked in Top Tech Interviews

AtlassianSwiggy

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.