分析

我们发现对于任意一对括号都满足,括号中的现有答案乘上括号后的数字。那么我们先将括号进行匹配,然后通过递归处理。时间复杂度为 ,因为我们读入的是字符串,所以对于数字的处理要用类似快读的方法。主要是要注意一下细节就可以了。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100;
#define LL long long
int pos[N],st[N],top,n;
char ch[N];
LL solve(int l,int r) {
    LL tot = 0;
//    cout << l << " " << r << endl;
    for(int i = l;i <= r;) {
        if(pos[i]) {
            LL res = solve(i + 1,pos[i] - 1);
            i = pos[i] + 1;
            LL x = 0;
            while(i <= r && isdigit(ch[i]))
            x = x * 10 + ch[i] - '0',i++;
            if(x) tot += res * x;
            else tot += res;
        }
        else {
            if(i + 1 <= r && isdigit(ch[i + 1]))
            {
                LL x = 0,old = i;i = i + 1;
                while(i <= r && isdigit(ch[i])) 
                x = x * 10 + ch[i] - '0',i++;
                tot +=  x * (ch[old] - 'A' + 1);
            }
            else tot += ch[i] - 'A' + 1,i++;
        }
    }
    return tot;
}
int main() {
    scanf("%s",ch+1);
    n = strlen(ch+1);
    for(int i = 1;i <= n;i++) {
        if(ch[i] == '(') st[++top] = i;
        if(ch[i] == ')') {pos[st[top]] = i;top--;}
    }
    cout << solve(1,n) << endl;
}