(用栈的话很简单)
(因为是一层一层for套下去的,所以一旦出现for循环我们就让q[++top]=循环次数)
(那么q数组表示循环次数,p数组表示当前循环的贡献)
(每当出现end操作时,当前循环的贡献就要给上一次循环)
(也就是p[top-1]+=p[top]*q[top],再top--)
(当top为0时,p[0]就可以给答案加上去了)
(值得一提的是,每次都要检查p[top]的值是否太大)
(太大就不继续了,因为这样连long long都会爆掉,应该直接输出overflow)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
const ll inf=pow(2,32)-1;
ll n;
string s;
ll q[maxn],top,p[maxn];
ll zhuan(string s)
{
ll ans=0;
for(int i=4;i<s.length();i++)
ans=ans*10+(s[i]-'0');
return ans;
}
void over(int k){
for(int i=k+1;i<=n;i++) getline(cin,s);
cout<<"OVERFLOW!!!";exit(0);
}
int main()
{
cin>>n;
getchar();
ll ans=0,temp=0;
for(int i=1;i<=n;i++)
{
getline(cin,s);
if(s[0]=='f')
q[++top]=zhuan(s);
else if(s[0]=='e')
{
p[top-1]+=p[top]*q[top];
p[top--]=0;
if(top==0) ans+=p[top],p[top]=0;
}
else
{
if(top) p[top]++;
else ans++;
}
if(ans>inf||p[top]>inf) over(i);
}
cout<<ans;
}