3
Map<List<String>, Integer> mem = new HashMap<>();5
void update(List<String> cur, int cnt) {7
mem.put(cur, mem.getOrDefault(cur, 0) + cnt);11
Node ans = new Node();12
for (List<String> key1 : mem.keySet()) {13
ans.update(key1, mem.get(key1));15
for (List<String> key2 : cur.mem.keySet()) {16
ans.update(key2, cur.mem.get(key2));22
Node ans = new Node();23
for (List<String> key1 : mem.keySet()) {24
ans.update(key1, mem.get(key1));26
for (List<String> key2 : cur.mem.keySet()) {27
ans.update(key2, -cur.mem.get(key2));33
Node ans = new Node();34
for (List<String> key1 : mem.keySet()) {35
for (List<String> key2 : cur.mem.keySet()) {36
List<String> next = new ArrayList<>();39
ans.update(next, mem.get(key1) * cur.mem.get(key2));45
Node evaluate(Map<String, Integer> vars) {46
Node ans = new Node();47
for (List<String> cur : mem.keySet()) {48
int cnt = mem.get(cur);49
List<String> free = new ArrayList<>();50
for (String tmp : cur) {51
if (vars.containsKey(tmp)) {52
cnt = cnt * vars.get(tmp);57
ans.update(free, cnt);63
List<String> toList() {64
List<String> ans = new ArrayList<>();65
List<List<String>> keys = new ArrayList<>(mem.keySet());68
(List<String> a, List<String> b) -> {69
if (a.size() != b.size()) {70
return b.size() - a.size();72
for (int i = 0; i < a.size(); i++) {73
if (a.get(i).compareTo(b.get(i)) != 0) {74
return a.get(i).compareTo(b.get(i));80
for (List<String> key : keys) {81
if (mem.get(key) == 0) {84
String cur = "" + String.valueOf(mem.get(key));85
for (String data : key) {95
Node make(String cur) {96
Node ans = new Node();97
List<String> tmp = new ArrayList<>();98
if (Character.isDigit(cur.charAt(0))) {99
ans.update(tmp, Integer.valueOf(cur));107
int getNext(String expression, int start) {109
while (end < expression.length() && Character.isLetterOrDigit(expression.charAt(end))) {115
int getPriority(char a) {116
if (a == '+' || a == '-') {118
} else if (a == '*') {124
Node helper(Stack<Node> nums, Stack<Character> ops) {130
} else if (op == '+') {136
public List<String> basicCalculatorIV(String expression, String[] evalvars, int[] evalints) {137
List<String> ans = new ArrayList<>();138
if (expression == null || expression.length() == 0 || evalvars == null || evalints == null) {142
Map<String, Integer> vars = new HashMap<>();143
for (int i = 0; i < evalvars.length; i++) {144
vars.put(evalvars[i], evalints[i]);147
int n = expression.length();148
Stack<Node> nums = new Stack<>();149
Stack<Character> ops = new Stack<>();150
for (int i = 0; i < n; i++) {151
char a = expression.charAt(i);152
if (Character.isLetterOrDigit(a)) {153
int end = getNext(expression, i);154
String cur = expression.substring(i, end + 1);156
Node now = make(cur);158
} else if (a == '(') {160
} else if (a == ')') {161
while (ops.peek() != '(') {162
nums.add(helper(nums, ops));165
} else if (a == '+' || a == '-' || a == '*') {166
while (ops.size() > 0 && getPriority(ops.peek()) >= getPriority(a)) {167
nums.add(helper(nums, ops));173
while (ops.size() > 0) {174
nums.add(helper(nums, ops));177
return nums.peek().evaluate(vars).toList();