模拟
1、遇到'(',我们就把栈的层数+1,以便出栈时累计
2、遇到字母后,判断下一位是否是小写字母,将其在map中的值取出加入栈中,再将最近一次的元素保存(暂记作key),等会有用^_^,别忘了判断UNKNOWN。
3、遇到数字,while循环取出它(记作x),说明上次的key有了用武之地,在栈中加入(x - 1)倍的key元素质量,因为上一次加了一份嘛
4、若遇到')',我们考虑直接取出后面的数字(还是x),然后将本层栈中答案乘上x,加入上一层栈中并清空这一层。
完结撒花!
#include<bits/stdc++.h> using namespace std; map<string,int> a; string s,ss; int x,top,b[100005]; int main() { cin>>s; while (s!="END_OF_FIRST_PART") { cin>>x; a[s]=x; cin>>s; } cin>>s; while (s!="0") { int fl=1; memset(b,0,sizeof(b)); s=' '+s; top=0; for (int i=1; i<=s.length(); i++) { if (s[i]>='A' && s[i]<='Z') { if (s[i+1]>='a' && s[i+1]<='z') { ss=s.substr(i,2); i++; } else ss=s.substr(i,1); if (!a[ss]) { printf("UNKNOWN "); fl=0; break; } else b[top]+=a[ss]; } if (s[i]>='0' && s[i]<='9') { x=0; while (s[i]>='0' && s[i]<='9') { x=x*10+s[i]-'0'; i++; } i--; b[top]+=(x-1)*a[ss]; } if (s[i]=='(') top++; if (s[i]==')') { i++,x=0; while (s[i]>='0' && s[i]<='9') { x=x*10+s[i]-'0'; i++; } b[--top]+=x*b[top+1]; b[top+1]=0; i--; } } if (fl) printf("%d ",b[0]); cin>>s; } return 0; }