CSP 201912-3 化学方程式 //字符串模拟

/*   Author : Rshs   */
#include<bits/stdc++.h>
using namespace std;
#define FI         first
#define SE         second
#define LL         long long
#define LDB        long double
#define MP         make_pair
#define PII        pair<int,int>
#define SZ(a)      (int)a.size()
#define DB1(a)     cerr<<(#a)<<'='<<a<<endl
#define DB2(a,b)   cerr<<(#a)<<'='<<a<<' '<<(#b)<<'='<<b<<endl
#define DB3(a,b,c) cerr<<(#a)<<'='<<a<<' '<<(#b)<<'='<<b<<' '<<(#c)<<'='<<c<<endl
const LDB pai = acos(-1.0L);
const LDB eps = 1e-10;
const LL  mod = 1e9+7;
const int MXN = 1e6+5;
inline int Add(int x,int y){return (x+=y)>=mod?x-mod:x;}
inline int Sub(int x,int y){return (x-=y)<0?x+mod:x;}
inline int Mul(int x,int y) {return 1LL*x*y%mod;}
inline int Pow(int x,LL  y){int res=1;while(y){if(y&1)res=1LL*res*x%mod;x=1LL*x*x%mod;y>>=1;}return res;}

char s[MXN];
map<string,int>m[2];
int NUM(char x){
    return x>='0'&&x<='9';
}
int LOW(char x){
    return x>='a'&&x<='z';
}
int UP(char x){
    return x>='A'&&x<='Z';
}
void cal(string a,int II){
  //  DB1(a);
    int p=0;
    int mu=0;
    int n=a.length();
    while(p<n&&NUM(a[p])) mu=(mu*10+a[p]-'0'),p++;
    if(mu==0)mu=1;
    for(int i=p;i<n;i++){
        if(UP(a[i])){
            int j=i+1;
            string yz;yz=yz+a[i];
            while(j<n&&LOW(a[j])) yz=yz+a[j],j++;
            int kh=0,all=1;
            if(j<n&&NUM(a[j])){
                int mm=0;
                while(j<n&&NUM(a[j])) mm=(mm*10+a[j]-'0'),j++;
                all=all*mm;
            }
            for(;j<n;j++){
                if(NUM(a[j])&&kh==1&&a[j-1]==')'){
                    int mm=0;
                    while(j<n&&NUM(a[j])) mm=(mm*10+a[j]-'0'),j++;
                    j--;
                    all=all*mm;
                    kh--;
                }
                if(a[j]=='(') kh--;
                if(a[j]==')')kh++;
            }
            m[II][yz]+=(all*mu);
        }
    }

}
void LY(int l,int r,int II){
    string ss;
    for(int i=l;i<=r;i++){
        if(s[i]=='+'){
            cal(ss,II);ss="";
        }
        else {
            ss=ss+s[i];
        }
    }
    cal(ss,II);
}
int Main(int avg){
    scanf("%s",s);
    m[0].clear();m[1].clear();
    int n=strlen(s);
    int eq=-1;
    for(int i=0;;i++){
        if(s[i]=='='){eq=i;break;}
    }
    LY(0,eq-1,0);
    LY(eq+1,n-1,1);
    //for(auto i:m[0]) DB2(i.FI,i.SE);
  //  for(auto i:m[1]) DB2(i.FI,i.SE);
    for(auto i:m[0]){
        if(m[1][i.FI]!=i.SE) {puts("N");return 0;}
    }
    for(auto i:m[1]){
        if(m[0][i.FI]!=i.SE) {puts("N");return 0;}
    }
    puts("Y");
    return 0;
}
int main(){
    int cas;cin>>cas;for(int i=1;i<=cas;i++)Main(i);
    return 0;
}
/*
11
H2+O2=H2O
CH4+2O2=CO2+2H2O
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
4Au+8NaCN+2H2O+O2+Ca=4Na(Au(CN)2)+4NaOH+Ca
Cu+As=Cs+Au
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值