他这个好像之和大写字母有关系;
小写字母跟着前面的的大写字母;
+和=代表要处理了;
()代表要乘了;
#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;
}