Files
2026-01-31 14:38:00 +08:00

51 lines
1.5 KiB
C++

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
int Q; // 原代码里的 n 建议改为 Q 匹配题目描述
cin >> Q;
while(Q--) {
int n; cin >> n;
string E; cin >> E;
unordered_map<char, int> 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;
}