传送门
用 栈 的 话 很 简 单 用栈的话很简单 用栈的话很简单
因 为 是 一 层 一 层 f o r 套 下 去 的 , 所 以 一 旦 出 现 f o r 循 环 我 们 就 让 q [ + + t o p ] = 循 环 次 数 因为是一层一层for套下去的,所以一旦出现for循环我们就让q[++top]=循环次数 因为是一层一层for套下去的,所以一旦出现for循环我们就让q[++top]=循环次数
那 么 q 数 组 表 示 循 环 次 数 , p 数 组 表 示 当 前 循 环 的 贡 献 那么q数组表示循环次数,p数组表示当前循环的贡献 那么q数组表示循环次数,p数组表示当前循环的贡献
每 当 出 现 e n d 操 作 时 , 当 前 循 环 的 贡 献 就 要 给 上 一 次 循 环 每当出现end操作时,当前循环的贡献就要给上一次循环 每当出现end操作时,当前循环的贡献就要给上一次循环
也 就 是 p [ t o p − 1 ] + = p [ t o p ] ∗ q [ t o p ] , 再 t o p − − 也就是p[top-1]+=p[top]*q[top],再top-- 也就是p[top−1]+=p[top]∗q[top],再top−−
当 t o p 为 0 时 , p [ 0 ] 就 可 以 给 答 案 加 上 去 了 当top为0时,p[0]就可以给答案加上去了 当top为0时,p[0]就可以给答案加上去了
值 得 一 提 的 是 , 每 次 都 要 检 查 p [ t o p ] 的 值 是 否 太 大 值得一提的是,每次都要检查p[top]的值是否太大 值得一提的是,每次都要检查p[top]的值是否太大
太 大 就 不 继 续 了 , 因 为 这 样 连 l o n g l o n g 都 会 爆 掉 , 应 该 直 接 输 出 o v e r f l o w 太大就不继续了,因为这样连long long都会爆掉,应该直接输出overflow 太大就不继续了,因为这样连longlong都会爆掉,应该直接输出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;
}