zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    数据库表关联分析
    java异常信息分析
    版本问题
    项目
    EXCEL工具
    项目安全
    服务器环境
    vue公共
    Linux 文件权限
    nginx
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12970476.html
Copyright © 2011-2022 走看看