CCF化学方程式的配平
程序员文章站
2022-05-12 14:53:25
...
#include <iostream>
#include <string>
#include <cctype>
#include <unordered_map>
using namespace std;
unordered_map<string, int> ans;
inline int strtonum(string s) {
int ans = 0;
for(int i = 0; i < s.length(); i ++) {
ans = ans * 10 + s[i] - '0';
}
return ans;
}
void handleans(string s, int islef, int c) {
if(!isdigit(s[s.length() - 1])) {
if(islef == 1) ans[s] += c;
else ans[s] -= c;
}else {
int i = s.length() - 1;
while(i >= 0 && isdigit(s[i])) {
i --;
}
string str = s.substr(i + 1, s.length() - i - 1);
handleans(s.substr(0, i + 1), islef, (c * strtonum(str)));
}
}
void handleE(string s, int islef, int c) {
int i = 0;
while(i < s.length()) {
if(isupper(s[i])) {
int start = i;
i ++;
while(i < s.length() && !isupper(s[i]) && !(s[i] == '(')) i ++;
handleans(s.substr(start, i - start), islef, c);
}else if(s[i] == '(') {
int flag = 1, start = i;
while(flag) {
i ++;
if(i < s.length() && s[i] == '(') {
flag ++;
}
if(i < s.length() && s[i] == ')') {
flag --;
}
}
if((i + 1 < s.length() && !isdigit(s[i + 1])) || (i + 1 == s.length())) {
// cout<<s.substr(start + 1, i - start - 1)<<endl;
handleE(s.substr(start + 1, i - start - 1), islef, c);
}else {
if(i + 1 < s.length()) {
int end = i;
i ++;
int ans = 0;
while(i < s.length() && isdigit(s[i])) {
ans = ans * 10 + s[i] - '0';
i ++;
}
// cout<<s.substr(start + 1, end - start - 1)<<endl;
handleE(s.substr(start + 1, end - start - 1), islef, c * ans);
}
}
}else if(s[i] == ')') i ++;
}
}
void handleEle(string s, int islef) {
if(isdigit(s[0])) {
int i;
for(i = 0; i < s.length(); i ++) {
if(!isdigit(s[i])) {
break;
}
}
handleE(s.substr(i, s.length() - i), islef, strtonum(s.substr(0, i)));
}else {
handleE(s, islef, 1);
}
}
void handle(string s, int islef) {
int start = 0;
for(int i = 0; i < s.length(); i ++) {
if(s[i] == '+') {
handleEle(s.substr(start, i - start), islef);
start = i + 1;
}
}
handleEle(s.substr(start, s.length() - start), islef);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n; cin>>n;
string s, lef, right;
while(n --) {
cin>>s;
int index = s.find("=");
lef = s.substr(0, index);
right = s.substr(index + 1, s.length() - index - 1);
handle(lef, 1);
handle(right, 2);
bool flag = true;
for(auto& word : ans) {
if(word.second) {
flag = false;
break;
}
}
if(flag) cout<<"Y\n";
else cout<<"N\n";
ans.clear();
}
return 0;
}
下一篇: android定位的实现
推荐阅读