1596 - Bug Hunt (UVA)

题目链接如下:

https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=448&page=show_problem&problem=4471

我的代码如下:

cpp 复制代码
#include <iostream>
#include <string>
#include <map>
// #define debug

struct arr{
    int len;
    std::map<int, int> mp;
};
std::string s;
int bug;
std::map<std::string, arr> arrMp;

bool validJudge(std::string &str, int &value){
    if (str.find("[") == std::string::npos){
        value = std::stoi(str);
        return true;
    }
    int left = str.find("[");
    int right = str.rfind("]");
    int v;
    std::string temp1, temp2;
    temp1 = str.substr(left + 1, right - left - 1);
    temp2 = str.substr(0, left);
    if (!validJudge(temp1, v) || arrMp[temp2].len <= v || arrMp[temp2].mp.find(v) == arrMp[temp2].mp.end()){
        return false;
    }
    value = arrMp[temp2].mp[v];
    return true;
}

bool judge(std::string &str){
    int left, right, v1, v2;
    std::string temp, temp1, temp2;
    if (str.find("=") == std::string::npos){
        left = str.find("[");
        right = str.rfind("]");
        temp = str.substr(left + 1, right - left - 1);
        if (!validJudge(temp, v1)){
            return false;
        }
        arrMp[str.substr(0, left)].len = v1;
        return true;
    }
    int equLoc = str.find("=");
    left = str.find("[");
    right = str.rfind("]", equLoc);
    temp1 = str.substr(left + 1, right - left - 1);
    temp2 = str.substr(equLoc + 1);
    if (!validJudge(temp1, v1) || v1 >= arrMp[str.substr(0, left)].len || !validJudge(temp2, v2)){
        return false;
    }
    temp = str.substr(0, left);
    arrMp[temp].mp[v1] = v2;
    return true;
}

int main(){
    #ifdef debug
    freopen("0.txt", "r", stdin);
    freopen("1.txt", "w", stdout);
    #endif
    while (getline(std::cin, s) && s != "."){
        bug = 0;
        int i = 0;
        arrMp.clear();
        do {
            if (bug) continue;
            ++i;
            if (!judge(s)){
                bug = i;
            }
        } while (getline(std::cin, s) && s != ".");
        printf("%d\n", bug);
    }
    #ifdef debug
    fclose(stdin);
    fclose(stdout);
    #endif
    return 0;
}
相关推荐
汉克老师6 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
晴天的雨.9927 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂7 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven7 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981037 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus18 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla19 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu1 天前
一个通用游戏数据服务器
c++·架构
another heaven1 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论