紫书第五章习题5-9 UVa1596-找bug

【C++】 详解 lower_bound 和 upper_bound 函数(看不懂来捶我!!!) 这两个函数是我在 LeetCode 上做题见到,看到不熟悉的函数 lower_bound 和 upper_bound让我感觉很难受,于是在C++ 官网去学习,例子就一个是最基础的,我看明白了。虽然是两个函数的接口就两个,但是有时候看别人使用的时候,里面参数还可以放不同的仿函数,我懵逼了。就去网上搜,但是大家讲解的都是它的第一个接口。我只能再把文档一遍一遍过,代码一遍遍的尝试,调试。最终通过查阅资料将其总结如下。 阅读详情

出处:https://blog.youkuaiyun.com/majing19921103/article/details/44409711

题目链接:https://vjudge.net/contest/231030#problem/I

输入并模拟一段程序,输出第一个bug所在的行。每行程序有两种可能:

数组定义:格式为arr[size],例如a[10];

赋值语句:格式为arr[index]=value,例如a[0]=3或者a[a[0]]=3

赋值语句可能会出现两种bug:下标index越界,使用未初始化变量。


思路:本题有两个关键点,首先在于程序中已经出现的数组以及已经赋值过的元素的存储,可以采用两个map完成,map<string,int>存储数组名和数组大小,map<string,map<int,int>>存储数组名以及其对应的已经赋值过得元素。其次在于计算数组的下标(下标的值可能是多层嵌套),这里可以利用栈轻松完成。


#include <iostream>  
#include <string>  
#include <vector>  
#include <set>  
#include <map>  
#include <sstream>  
#include <fstream>  
#include <stack>  
  
using namespace std;  
  
map<string, long long> array_table;  
map<string,map< long long, long long>> array_value_table;  
  
#define FILE  
  
  
void partition(string origin,string &left,string &right)  
{  
    int index = origin.find_first_of('=',0);  
    if(index!=-1)  
    {  
        left = origin.substr(0,index);  
        right = origin.substr(index+1);  
    }  
    else  
    {  
        left = origin;  
        right = "";  
    }  
}  
  
void getArray(string str,string &name, string &value)  
{  
    int begin = str.find_first_of('[',0);  
    int end = str.find_last_of(']');  
    if(begin!=-1)  
    {  
        name = str.substr(0,begin);  
        value = str.substr(begin+1,end-begin-1);  
    }  
    else  
    {  
        name = "";  
        value = str;  
    }  
}  
  
bool isValue(string value)  
{  
    int index = value.find_first_of('[',0);  
    if(index!=-1)  
        return true;  
    return false;  
}  
  
long long calculateArray(string str)  
{  
    string name,value;  
    getArray(str,name,value);  
    stack<string> s;  
    long long ans;  
    while(name!="")  
    {  
        string left,right;  
        getArray(value,left,right);  
        if (array_table.count(name)==0)  
        {   
            return -1;  
        }  
        value = right;  
        s.push(name);  
        name = left;  
  
    }  
    ans = atoi(value.c_str());  
    if(ans<0)  
        return -1;  
    while (!s.empty())  
    {  
        string left = s.top();  
        long long num = array_table[left];  
        if(ans>=num)  
            return -1;  
        if(array_value_table[left].count(ans)==0)  
            return -1;  
        ans = array_value_table[left][ans];  
        s.pop();  
    }  
    return ans;  
}  
  
int main(int argc, char* argv[])  
{  
#ifdef FILE  
    ifstream in("data.txt");  
    ofstream out("output.txt");  
    cin.rdbuf(in.rdbuf());  
    cout.rdbuf(out.rdbuf());  
#endif  
    string str;  
    bool mark = false,isfirst = true;  
    int num = 0;  
    while(cin>>str)  
    {  
        if(str!=".")  
        {  
            mark = false;  
            num++;  
            string left,right;  
            partition(str,left,right);  
            if(right=="")  
            {  
                string name,value;  
                getArray(left,name,value);  
                array_table[name] = atoi(value.c_str());  
            }  
            else  
            {  
                string name, value;  
                long long ans,temp;  
                getArray(left,name,value);  
                temp = calculateArray(value);  
                ans = calculateArray(right);  
                if(temp>=0&&temp<array_table[name]&&ans!=-1)  
                {  
                    array_value_table[name][temp] = ans;  
                }  
                else  
                {  
                    if(isfirst)  
                    {  
                        cout<<num<<endl;  
                        isfirst = false;  
                    }  
                }  
            }  
        }  
        else  
        {  
            array_table.clear();  
            array_value_table.clear();  
            if(mark)  
                break;  
            else  
            {  
                if(isfirst)  
                    cout<<0<<endl;  
                mark = true;  
                isfirst = true;  
                num = 0;  
            }  
        }  
    }  
    return 0;  
}

深入浅出ISP:用RKISP2.x Tuner工具理解AWB、AE、HDR等核心模块的实战调参 本文深入解析RKISP2.x Tuner工具在ISP图像处理中的实战应用,重点探讨AWB、AE、HDR等核心模块的调参技巧。通过环境搭建、调试工具使用和实际案例,帮助开发者掌握如何在不同光照条件下优化图像质量,实现精准的白平衡、曝光控制和动态范围处理。 阅读详情

相关推荐

Python+Flask+Echarts打造全国气象数据可视化分析大屏

本文详细介绍了如何使用Python+Flask+Echarts构建全国气象数据可视化分析大屏,实现实时监控、趋势分析和快速决策。通过Python强大的数据处理能力、Flask的轻量级优势和Echarts的交互体验,打造高效的气象数据可视化系统,提升农业、物流等行业的决策效率。

weixin_29061531的博客 1060

UVA-1596 找bug 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 AC代码 有个点需要注意: ASCII中,在Z和a中间还有6个字符,因此数组开大一点比较好。 getValue有多种实现方式,栈,递归,数组都可以。 下面我用的是栈,最后我也列出了递归的做法。 #include<iostream> #include<string> #include<map> #include<vector> #in

Coding home - 漂流瓶jz 616

改善电流不匹配的级联电流镜布局设计 2002

模拟金属氧化物半导体 (MOS) 集成电路的性能在很大程度上取决于匹配精度的因素。 电流镜的匹配精度在模拟 IC 性能中尤为重要。 布局技术和器件尺寸被认为是可以在很大程度上改善匹配行为的主要因素。 尽管这些信息很重要,但对这两个因素的研究或研究有限。 在本文中,我们基于 Lan 等人 [1999] 提出的简单电流镜提出了一种新的级联电流镜布局技术。 Cascode电流镜的新布局在参数梯度存在的情况下改善了匹配特性。 讨论了跨晶体管有源区域的阈值梯度对电流镜匹配特性的影响。 使用 SPICE 仿真比较了新

Srfun的博客 4228

Uva 1596 - Bug Hunt

一.题目 题目链接:Uva1596 二.思路 因为涉及到多个数组的嵌套,两个最近的[]是一对,先进先出,因此很明显是要用到栈的。我是用双栈来完成嵌套数组的处理的,核心思想就是从最里层的数组开始,计算出它的下标和数组名,判断是否有错误,有错误直接返回,没错误就继续让当前数组名该下标下的值成为下一个下标,然后获取新的数组名,直到栈空。数组的存储我是用map>,来实现的,其中里层的map实

CSerwangjun的博客 1024

惊爆揭秘!异步启动永磁同步电机,调速核心技术大起底

传统的同步启动方式需要额外的同步设备,成本高且维护复杂。异步启动PMSM则巧妙地利用了鼠笼感应电机的启动原理,无需额外同步设备即可实现安全可靠的启动。其核心思想是将定子电流分解为两个正交的分量:磁链分量(id)和转矩分量(iq),分别控制这两个分量,从而实现对电机转矩的精确控制。随着电机设计技术的不断进步和控制算法的不断优化,异步启动PMSM的性能将得到进一步提升,应用范围也将更加广泛。异步启动PMSM的调速技术是其核心技术之一,直接影响着电机的性能和应用范围。

wen8789的博客 982

华为od 面试八股文_Spring_03_含答案

控制反转IOC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:依赖注入和依赖查找依赖注入;

MISAYAONE的博客 2341

UVa:1596 - Bug Hunt

题目描述: 输入并模拟一段程序,输出第一个bug所在的行。每行程序有两种可能: 数组定义:格式为arr[size],例如a[10]; 赋值语句:格式为arr[index]=value,例如a[0]=3或者a[a[0]]=3 赋值语句可能会出现两种bug:下标index越界,使用未初始化变量。 思路:本题有两个关键点,首先在于程序中已经出现的数组以及已经赋值过的元素的存储,可以采用

没有趟不过的河 2899

世界模型(World Models)进展全景调研(截至 2025-08)

A5) 2019-07(待核验) | C-SWM:Contrastive Structured World Models(Kipf et al.)A6) 2019-07(待核验) | SLAC:Stochastic Latent Actor-Critic(Lee et al.)A3) 2015-12(背景注记,待核验) | Embed to Control(E2C,Watter et al.)Nature 2020)Repro/Code:werner-duvaud/muzero-general(社区)

u013250861的博客 488

习题5-9 UVa1596-Bug Hunt

本题算是不难但是很绕的题了。首先要想清楚用什么来存放读入的数据,其次数组的名与值要怎么分离开来,然后如何判断有没有bug,是左值与右值分开判断?还是将判断写到一个函数里?d最后,读入的数组应该存储起来,以便应对数组嵌套。其余的代码里注释得很详细了。 这次学到了isdigit(int c)函数,它用来判断参数是否为阿拉伯数字0~9,若是返回true,否则返回false。还有使用pair类模板来创建对...

qq_21606413的博客 382

通过傅里叶变换进行音频变声变调

在游戏或者一些特殊场景下为了提高娱乐性或者保护声音的特征,我们会对音频进行变声变调处理。

yang1fei2的博客 1815

OFDM调制解调系统信道估计和均衡算法的MATLAB仿真

然后,从接收到的信号中提取导频序列,并使用LS算法进行信道估计。OFDM(正交频分复用)是一种常用于高速数据传输的调制技术,它将高速数据流分割成多个低速子载波,通过在不同的子载波上传输数据,实现了频域上的正交性。因此,信道估计和均衡算法在OFDM系统中起着至关重要的作用,用于减小信道衰落引起的影响。通过运行上述代码,可以进行基于LS算法的OFDM调制解调系统信道估计和均衡的MATLAB仿真。本文将介绍一种基于LS(最小二乘)算法的OFDM调制解调系统信道估计和均衡算法,并提供相应的MATLAB仿真代码。

uote_e的博客 229

UVA - 1596 Bug Hunt

/* 这题自己想的时候,想到可以用栈来匹配和拆掉括号,这个还是比较容易想到,而判断是“定义语句”,还是“赋值语句”,也可以想到用find函数,看能否找到等号。 但是,具体到怎么完整实现的时候,思路就有点懵了,可见做题量还是不够T^T 最后还是借用别人的思路,按照别人的框架,自己理解以后,再独立写了一遍 */ /* 法一: 参...

weixin_30254435的博客 237

大数据架构中的数据治理:元数据管理与数据血缘追踪实践

本文将聚焦大数据架构中数据治理的两大核心支柱——元数据管理与数据血缘追踪元数据管理的目标、类型与实施步骤(从需求分析到工具落地);数据血缘追踪的技术实现(静态解析、动态捕获、混合方案)与应用场景;如何将两者结合,构建完整的数据治理体系,并通过真实案例展示落地效果。元数据管理:定义了业务/技术/操作元数据,讲解了工具选型(如Apache Atlas)、采集(Hook/API)、存储(关系库+图数据库)、应用(数据发现、质量监控);数据血缘追踪。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 868

紫书《算法竞赛入门经典》

紫书《算法竞赛入门经典》题目一览 第3章 数组和字符串(例题) UVA 272TEX Quotes UVA 10082WERTYU UVA 401Palindromes UVA 340Master-Mind Hints UVA 1583Digit Generator UVA 1584Circular Sequence 第3章 数组和字符串(习题) UVA 1585Sc...

既然弱小,就只顾变强就是了 2735

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

算法竞赛入门经典(第二版)-刘汝佳-第五章 C++与STL 习题(13/16)

说明本文是我对第五章16道习题的练习总结,建议配合紫书——《算法竞赛入门经典(第2版)》阅读本文。 另外为了方便做题,我在VOJ上开了一个contest,欢迎一起在上面做:第五章习题contest 如果想直接看某道题,请点开目录后点开相应的题目!!!习题习5-1 UVA 1593 代码对齐(vector)思路 此题的重点在于读入数据部分,读取每一行我用了getline,然后再用stringst

梁山伯的专栏 2744

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

5-9 UVA 1596 Bug Hunt找BUG

题意: 输入很多行代码,找出这些代码中第一个错误的,代码就是C语言中的数组建立,数组元素的赋值。多组数据用'点'隔开,最后以点结束。 好恶心的题,只要类似这种,字符串操作的题目,我都会反感,但没办法,只能耐住性子一点一点找了一下午BUG(T T), 越是复杂的题目就得写的越规范,所以可以尝试采用紫书之前提到的“自顶向下,逐步求精”的方法。 因为自己在写的过程中,没想整体思路,而是一

aozil_yang的博客 1019

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

1596 - Bug Hunt (UVA)

【代码】1596 - Bug Hunt (UVA)

linh2006的博客 746

UVA1596 Bug Hunt 找Bug 解题报告

因为存在嵌套,所以解析一个数组变量的值要用递归或者栈,用map维护数组名到数组信息结构体的映射,数组信息结构体应该包括数组的大小,以及该数组各个下标的值(用map< int, int >来记录)。数组定义,格式为arr[size]。例如a[10]或者b[5],可用下标分别是0~9和0~4。定义之后所有元素均为未初始化状态。赋值语句,格式为arr[index]=value。例如a[0]=3或者a[a[0]]=a[1]。程序不超过1000行,每行不超过80个字符且所有常数均为小于2^31的非负整数。

qq_45554473的博客 715

UVA 1596 Bug Hunt

题目链接:https://vjudge.net/problem/UVA-1596 题目翻译摘自《算法禁赛入门经典》 题目大意   输入并模拟执行一段程序,输出第一个bug所在的行。每行程序有两种可能: 数组定义,格式为 arr[size]。例如 a[10] 或者 b[5],可用下标分别是 0~9 和 0~4。定义之后所有元素均为未初始化状态。 赋值语句,格式为 arr[in...

weixin_30600197的博客 265

UVa 1596 - Bug Hunt(细节)

输入一段程序代码,要你找出bug,有两种bug,一是引用未赋值变量,二是下标越界。 主要考察的就是细节,思路并不难,找程序的bug,首先自己写的程序细节上不能出bug。

wcr1996的专栏 2530

UVA 1596

题意:给出一段程序,输出第一个出现bug的位置。 程序有两个格式:一种是定义一个数组,并规定数组大小;一种是对数组元素进行赋值。  Bug有两种:一种是数组越界,一种是使用未初始化的变量。 思路:模拟判断 如果是第一种语句,就给丢进map给个编号并记录数组大小。 第二种语句用递归判断一下,因为可以嵌套类似这样a[a[1]]。 #include #include #include

DS-K的博客 530

【刘汝佳书】习题5-9 UVA1596(用stack解决嵌套)

【2019.4.10】 思路: 输入数据一共有两种语句: 1、声明语句:形式如:数组名[数组大小] 其中数组名为一个char型字母,数组大小为一个int型数字 2、赋值语句:形式如:数组名[数组下标] = 赋值数字 其中【数组下标】和【赋值数字】都是int型数字,但其输入形式有可能为: 12 a[1] a[b[0]] b[a[a[0]]] …… 诸如此类的多层嵌套,需要从最内层一直计算到最外层,才...

夏至是个程序媛 479

UVA1596 找bug

观摩大牛的代码改的。 题意有两种操作: 1.声明数组: a[4], a[a[b[4]]]; 2.给数组赋值: a[4] = a[a[b[4]]]; 然后判断第一次出现错误的行. c++代码 #include&lt;iostream&gt; #include&lt;map&gt; #include&lt;vector&gt; #include&lt;string&gt; #includ...

qq_38598257的博客 418

UVa1596 - Bug Hunt

#include #include #include #include using namespace std; string s0, s, s1, s2, left_value,right_value; int bug; map a; map value; string get_value(string x, string arr){ unsigned int t = 0; st

Dosth_Magic 1358

UVA - 1596 Bug Hunt

题目大意: 有两种语句,一种定义 a[size] 另外一种赋值 a[id] = b[id] / a[id] = value; 类似这种主要思路:用map<string,int> 存放变量名和变量名对应的size, map<string,map<int,int> > 来存放哪几个id是被初始化过的了,只有这里面的值可以出现在[]里面。 check() 递归检查类似a[b[c[id]]] 这种

shinimashzi 838

Uva1596 Bug Hunt 【map+stack】【习题5-9】

map,stack,细节,看清题目!

GuoZLH的博客 575
上一篇: 紫书第五章习题 5-15 UVa 12333 - Revenge of Fibonacci
下一篇: 紫书第五章习题 5-10 UVa1597-searching the web
JXUFE_ACMer
博客等级 码龄9年 20粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值