B. Catch Overflow!(手工栈模拟)
\(用栈的话很简单\)
\(因为是一层一层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;
}

浙公网安备 33010602011771号