题目描述
102班每天要写化学方程式,现在要想办法批改方程式。方程式中反应物的顺序可以不一样,中间可以有空格。不会出现沉淀和气体符号和反应条件。错误有系数不对(下标不对,如CO2为CO3也算系数不对。反应物或生成物中不会出现元素相同,系数不同的化学式,如:CO和CO2不会一起出现在反应物或生成物中),化学式错误,缺少反应物,两边元素不守恒。
输入
第一排输入N,M
第二排输入长度为N的字符串为正确方程式
第三排输入长度为M的字符串为要批改方程式
输出
正确输出RIGHT
错误第一排输出WRONG,第二排输出错误原因(只系数不对为1,其他错误和有两个以上错误为2)
样例输入
34 29 2Na O H + H2S O4 = Na 2 S O4+2H2O H2S O4 +2NaO H =Na2 S O4+2H2O
样例输出
RIGHT
提示
34 25
2Na O H + H2S O4 = Na 2 SO4 +2H2O
H2S O4
+NaO H=2H2O +2 K Cl
WRONG
2
1<=N<=100
1<=M<=100
代码
#pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize("Ofast") #include<bits/stdc++.h> #define rep(i, j, k) for (register int i = (j); i <= (k); i ++) using namespace std; char a[1005],b[1005]; vector< string >ys1,ys2; int fff,h1,h2; template <class T> inline void read(T &x) { x = 0; register char c = getchar(); register bool f = 0; while (!isdigit(c)) f ^= c == '-', c = getchar(); while (isdigit(c)) x = x * 10 + c - '0', c = getchar(); if (f) x = -x; } string getnum(string s) { string tmp=""; int len=s.length(); for(int i=0;i<len;i++) { if(s[i]<='9'&&s[i]>='0') { tmp=tmp+s[i]; } } return tmp; } string getchar(string s) { string tmp=""; int len=s.length(); for(int i=0;i<len;i++) { if(s[i]>'9'||s[i]<'0') { tmp=tmp+s[i]; } } return tmp; } bool check(char x) { if(x<='9'&&x>='0') return true; if(x<='Z'&&x>='A') return true; if(x<='z'&&x>='a') return true; if(x==' '||x=='+'||x=='=') return true; return false; } int main() { string tmp=""; gets(a); gets(a); gets(b); int n=strlen(a); int m=strlen(b); for(int i=0;i<n;i++) { if(fff==0&&a[i]!=' ') h1+=a[i]; if(a[i]=='=') fff=1; if(check(a[i])!=1) continue; if(a[i]=='+'||a[i]=='=') { ys1.push_back(tmp); tmp=""; } else if(a[i]!=' ') { tmp=tmp+a[i]; } } if(tmp!="") { ys1.push_back(tmp); } tmp=""; fff=0; for(int i=0;i<m;i++) { if(fff==0&&b[i]!=' ') h2+=b[i]; if(b[i]=='=') fff=1; if(check(b[i])!=1) continue; if(b[i]=='+'||b[i]=='=') { ys2.push_back(tmp); tmp=""; } else if(b[i]!=' ') { tmp=tmp+b[i]; } } if(tmp!="") { ys2.push_back(tmp); tmp=""; } sort(ys1.begin(),ys1.end()); sort(ys2.begin(),ys2.end()); if(ys1==ys2) { if(h1==h2) { cout<<"RIGHT"<<endl; return 0; } } int c1=0,c2=0; if(ys1.size()!=ys2.size()) c1=1,c2=1; else { n=ys1.size(); for(int i=0;i<n;i++) { if(ys1[i]!=ys2[i]) { if(getnum(ys1[i])!=getnum(ys2[i])) c1=1; if(getchar(ys1[i])!=getchar(ys2[i])) c2=1; } } } cout<<"WRONG"<<endl; if(c1==1&&c2==0) cout<<1<<endl; else cout<<2<<endl; return 0; }