201912-3 化学方程式
生活随笔
收集整理的這篇文章主要介紹了
201912-3 化学方程式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
他這個好像之和大寫字母有關系;
小寫字母跟著前面的的大寫字母;
+和=代表要處理了;
()代表要乘了;
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<set> #include<stack> using namespace std; typedef long long ll; const int N=3e5+10,mod=998244353; char c[N]="+";//前面不用特判了; 后面后向加不了。。加了時候以后讀入數據時好像沒覆蓋; int X[10000];struct po{int a,c; };//a相當于判斷a==-1是( / ) 大于零是字母; vector<po>s(N);//不知道棧可不可以索引。。。。 int hh=-1; stack<int>st;//括號序列的處理; bool isdig(char x){return x>='0'&&x<='9';} bool islow(char x){return x>='a'&&x<='z';} bool isbig(char x){return x>='A'&&x<='Z';}void CLEAR(int h,int K) {while(hh>=0){int a=s[hh].a,c=s[hh].c;hh--;if(a==-1)continue;X[a]+=h*c*K;}return ; } int main() {int t;scanf("%d",&t);while(t--){scanf("%s",c+1);int h=1,K=1;//h是等號左邊還是右邊;k是每個化學式的系數; for(int i=0;c[i];i++){char x=c[i];if(x=='=')CLEAR(h,K),h=-1,K=1;else if(x=='+')CLEAR(h,K),K=1;else if(x=='(')s[++hh]={-1,0},st.push(hh);else if(x==')')s[++hh]={-1,st.top()},st.pop();//這樣找到每個括號左邊的位置 放到c else if(isbig(x))s[++hh]={x-'A'+1,1};//+1是防止 Ag=Au 個數默認為1; else if(islow(x))s[hh].a=s[hh].a*30+x-'a'+1; //小寫字母就跟在之前大寫字母的后面; else if(isdig(x)){int v=0;bool H=(c[i-1]=='+'||c[i-1]=='=');//是分界限 while(isdig(c[i]))v=v*10+c[i]-'0',i++;i--;if(H){K=v;continue;}//賦系數; if(s[hh].a==-1){int l=s[hh].c,r=hh;for(int i=l;i<=r;i++)if(s[i].a!=-1)s[i].c*=v;//乘到里面; }s[hh].c=v; // 修改個數; }}CLEAR(h,K); bool flag=1;for(int i=0;i<1000;i++)if(X[i])flag=0;puts(flag?"Y":"N");memset(X,0,1000*sizeof(int));} return 0; }總結
以上是生活随笔為你收集整理的201912-3 化学方程式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见21种漏洞编码安全规范及解决方案
- 下一篇: 2021-09-211547G - Ho