主要思路就是一个递归。写了一个solution函数,碰到括号就往里面一扔。
比赛的时候犯了不少错误。
.stack得写里面,因为是递归,要生成新的stack,不能混用
.要注意每个操作里i最后会发生什么变化,要是需要加多少的就加

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,sm;
ll res;
string s ,str;
unordered_map<string,int> um;

int solution(string x){
    stack<int> stk;
    int len = x.size();
    ll res = 0;
    for(int i=0;i<len;i++){
        if(x[i]=='('){
            int zuo=1 , j;
            for( j=i+1;zuo;j++){
                if(x[j]=='(') zuo++;
                if(x[j]==')') zuo--;
            }
            stk.push(solution(x.substr(i+1,j-i-1)));
            i=j-1;
        }
        else if(x[i]>='0' && x[i]<='9'){
            int tmp=x[i]-'0';
            while(i+1<len && x[i+1]>='0' && x[i+1]<='9'){
                tmp=tmp*10+x[i+1]-'0';
                i++;
            }
            int ttmp = tmp*stk.top();
            stk.pop();
            stk.push(ttmp);

        }
        else if(x[i]>='A' && x[i]<='Z'){
            if(um[x.substr(i,2)]){
                stk.push(um[x.substr(i,2)]);
                i++;
            }
            else if(um[x.substr(i,1)]){
                stk.push(um[x.substr(i,1)]);
            }
        }
    }
    while(!stk.empty()){
        res += stk.top();
        stk.pop();
    }
    return res;
}
int main(){
    cin>>m>>n;
    while(m--){
        cin>>s>>sm;
        um[s]=sm;
    }
    while(n--){
        cin>>str;
        cout<<solution(str)<<endl;
    }
    return 0;
}