51 lines
1.5 KiB
C++
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;
|
|
}
|