#include #include #include #include using namespace std; int main() { int Q; // 原代码里的 n 建议改为 Q 匹配题目描述 cin >> Q; while(Q--) { int n; cin >> n; string E; cin >> E; unordered_map mp; for(int j = 0; j < n; ++j) { string s; cin >> s; // 找到等号位置,解析后面的数字 mp[s[0]] = stoi(s.substr(2)); } long long left_sum = 0, right_sum = 0; long long* cur_sum = &left_sum; // 指向当前正在计算的那一侧 int sign = 1; for(int i = 0; i < E.length(); ++i) { if(E[i] == '=') { *cur_sum += 0; // 结算最后一项(如果有) cur_sum = &right_sum; // 切换到右侧 sign = 1; // 重置符号 } else if(E[i] == '+') { sign = 1; } else if(E[i] == '-') { sign = -1; } else if(E[i] >= 'a' && E[i] <= 'z') { *cur_sum += (long long)sign * mp[E[i]]; } else if(isdigit(E[i])) { long long num = 0; while(i < E.length() && isdigit(E[i])) { num = num * 10 + (E[i] - '0'); i++; } *cur_sum += sign * num; i--; // 补偿循环的 ++ } } if(left_sum == right_sum) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }