2
public int scoreOfStudents(String s, int[] answers) {3
BitSet[][] ok = new BitSet[32][32];4
solve(0, s.length() - 1, s, ok);5
int ans = 0, correct = eval(s);6
for (int n : answers) {9
} else if (ok[0][s.length() - 1].get(n)) {16
private BitSet solve(int lo, int hi, String s, BitSet[][] memo) {17
if (memo[lo][hi] != null) { // memo20
BitSet cur = new BitSet();21
if (lo == hi) { // base case -> number itself [0 - 9]22
cur.set(s.charAt(lo) - '0');23
return memo[lo][hi] = cur;25
for (int i = lo; i <= hi; i++) {26
if (s.charAt(i) == '+' || s.charAt(i) == '*') {27
BitSet l = solve(lo, i - 1, s, memo); // left28
BitSet r = solve(i + 1, hi, s, memo); // right29
for (int j = l.nextSetBit(0); j >= 0; j = l.nextSetBit(j + 1)) {30
for (int k = r.nextSetBit(0); k >= 0; k = r.nextSetBit(k + 1)) {31
int val = s.charAt(i) == '+' ? j + k : j * k;40
return memo[lo][hi] = cur;43
private int eval(String s) {44
Deque<Integer> stack = new ArrayDeque<>();45
Deque<Character> op = new ArrayDeque<>();46
for (char ch : s.toCharArray()) {47
if (ch == '+' || ch == '*') {48
while (!op.isEmpty() && (ch == '+' || op.peek() == '*')) {50
int r = stack.pop(), l = stack.pop();51
stack.push(w == '+' ? l + r : l * r);58
while (!op.isEmpty()) {60
int r = stack.pop(), l = stack.pop();61
stack.push(w == '+' ? l + r : l * r);