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