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;
}
posted @ 2020-05-27 09:26  倾叶子佮  阅读(187)  评论(0)    收藏  举报