UVa1596 Bug Hunt

Author Avatar
空気浮遊 2018年05月25日
  • 在其它设备中阅读本文章
  • STL
  • 模拟
  • 分享到 Facebook
  • 分享到 Telegram
  • 分享到 Twitter
  • 分享到微博

Problem

程序有赋值语句和声明语句
a[<value>]
a[<expression>]=<expression>/<value>
模拟程序,并找出两种 BUG:

  • 越界
  • 调用了未声明的变量

Solution

填了个远古大坑。
STL 全家福 + 完全乱搞

// Code by ajcxsu
// Problem: BUGHUNT

#include<bits/stdc++.h>
using namespace std;

int lim[500];
map<int, int> ma[500];

bool found;
typedef pair<char, int> mpair;
mpair analyze(string x) {
    vector<char> stk;
    string num;
    for(int i=0;i<x.size();i++) 
        if((x[i]>='a' && x[i]<='z') || (x[i]>='A' && x[i]<='Z')) stk.push_back(x[i]);
        else if(x[i]>='0' && x[i]<='9') num+=x[i]; 
    int nx=stoi(num);
    if(stk.size()==0) return mpair('*', nx);
    for(int i=stk.size()-1;i>0;i--) {
        if(nx<=lim[stk[i]] && ma[stk[i]].count(nx)) nx=ma[stk[i]][nx];
        else { 
            found=1;
            break;
        }
    }
    return mpair(stk[0], nx);
}

int main() {
    string cmd;
    while(1) {
        memset(lim,-1,sizeof(lim));
        for(int i=0;i<500;i++) ma[i].clear();
        found=0;
        cin>>cmd;
        if(cmd[0]=='.') break;
        int cnt=0;
        do {
            cnt++;
            string a, b;
            mpair ra, rb;
            bool ass=false;
            for(int i=0;i<cmd.size();i++)
                if(cmd[i]=='=') a=cmd.substr(0, i), b=cmd.substr(i+1, cmd.size()-i), ass=true;
            if(ass) {
                ra=analyze(a), rb=analyze(b);
                if(!found && lim[ra.first]>=ra.second && rb.first=='*') 
                    ma[ra.first][ra.second]=rb.second; 
                else if(!found && lim[rb.first]>=rb.second && ma[rb.first].count(rb.second) && lim[ra.first]>=ra.second)
                    ma[ra.first][ra.second]=ma[rb.first][rb.second];
                else found=1;
            }
            else ra=analyze(cmd), lim[ra.first]=ra.second-1;
            if(found) {
                while(cmd[0]!='.') cin>>cmd;
                cout<<cnt<<endl;
            }
            else cin>>cmd;
        } while(cmd[0]!='.'); 
        if(!found) cout<<0<<endl; 
    }
    
    return 0;
}

本文链接:https://pst.iorinn.moe/archives/sol-uva-1596.html
许可: https://pst.iorinn.moe/license.html
若无特别说明,博客内的文章默认将采用 CC BY 4.0 许可协议 进行许可☆

      新篇
旧篇      
    • fingerprint Login
  • home 主页
  • inbox 归档
    • December 2024 1
    • August 2024 1
    • June 2024 1
    • April 2024 3
    • March 2024 1
    • February 2024 2
    • January 2024 1
    • November 2023 1
    • August 2023 1
    • May 2023 1
    • February 2023 2
    • January 2023 2
    • July 2022 1
    • June 2022 1
    • April 2022 1
    • March 2022 1
    • February 2022 2
    • December 2021 1
    • November 2021 1
    • August 2021 3
    • July 2021 3
    • April 2021 2
    • March 2021 1
    • February 2021 4
    • January 2021 2
    • December 2020 1
    • November 2020 1
    • October 2020 3
    • September 2020 1
    • August 2020 1
    • July 2020 1
    • March 2020 1
    • December 2019 1
    • September 2019 1
    • July 2019 1
    • April 2019 2
    • March 2019 13
    • February 2019 15
    • January 2019 11
    • December 2018 3
    • November 2018 6
    • October 2018 28
    • September 2018 32
    • August 2018 19
    • July 2018 13
    • June 2018 27
    • May 2018 11
    • April 2018 12
    • March 2018 19
    • February 2018 8
    • January 2018 7
    • December 2017 2
    • November 2017 2
  • apps 分类
    • 笔记
    • 题解
    • 杂文
    • 技术
    • 游戏
    • 小说
  • 留言板
  • 关于
  • 友链
  • 文章总数 282
主题 - Material i
expand_less
Copyright © 2025 雪屋
Float in air.
Powered by Typecho
Theme - Material