思路一:
一开始想用堆栈,结果就一直卡在第7个点上,后来发现可以用递归做。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e5+10;
typedef long long LL;
LL MX = 1,tim;
void Init(){
for(int i=1;i<=32;i++) MX *= 2;
MX--;
}
LL fun(){
LL sum = 0;
while(tim--){
char ss[7];
scanf("%s",ss);
if(ss[0]=='a'){
sum++;
if(sum>MX) return -1;
}
else if(ss[0]=='f'){
LL x;scanf("%lld",&x);
LL tp = fun();
if(tp==-1) return -1;
sum += tp*x;
if(sum>MX) return -1;
}
else if(ss[0]=='e'){
return sum;
}
}
return sum;
}
int main(void){
Init();
scanf("%lld",&tim);
LL ans = fun();
if(ans==-1) printf("OVERFLOW!!!\n");
else printf("%lld\n",ans);
return 0;
}
思路二:
看了别人的代码发现可以不递归,
简单的说就是先把for循环一层一层的存在一个堆栈里,
每次遇到add再取栈顶元素访问,(与我一开始的思路不同,这里是add时修改ans,而不是之前我想的en再取修改。)
遇到en就出栈。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 2e5+10;
typedef long long LL;
LL st[maxn],MX = 1;
void Init(){
for(int i=1;i<=32;i++) MX *= 2;
MX--;
}
int main(void){
Init();
st[0] = 1;
int t1 = 0,fg = 0;
LL ans = 0;
int T;scanf("%d",&T);
while(T--){
char ss[7];
scanf("%s",ss);
if(ss[0]=='a'){
if(fg) continue;
if(ans>MX) fg = 1;
else if(ans+st[t1]>MX) fg = 1;
else ans += st[t1];
}
else if(ss[0]=='f'){
LL x;scanf("%lld",&x);
st[t1+1] = st[t1]*x;
if(st[t1+1]>MX) st[t1+1] = MX+1; //注意防止数字过大越界。
t1++;
}
else if(ss[0]=='e'){
t1--;
}
if(ans>MX) fg = 1;
}
if(fg) printf("OVERFLOW!!!\n");
else printf("%lld\n",ans);
return 0;
}