UVA - 1596 Bug Hunt(STL)

点击打开题目链接
找第一个bug所在行
bug:
1.数组越界
2.使用未初始化的数组元素
两个map,分别存取数组的大小和某一元素的值。处理嵌套数组时可以递归,也可以从串最后往前迭代遍历。
代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll maxn = 1e15;
map<int, int> mp;//数组元素大小
map<int, map<int, int> > ass;//数组元素值
char str[100000];

int toIndex(char c) {
    if(isupper(c)) return c - 'A' + 26;
    else return c - 'a';
}

int  toInt(char s[]) {
    int a = 0;
    if(isdigit(s[0])) {
        for(int i = 0; s[i] != ']' && i != strlen(s); i++) {
            a *= 10;
            a += s[i] - '0';
        }
    }
    else {
        for(int i = 2; s[i] != ']' && i != strlen(s); i++) {
            a *= 10;
            a += s[i] - '0';
        }
    }
    return a;
}

ll isLegalR(char s[], int t) {
    ll tmp = maxn, flag = 1;
    int len = strlen(s) - 1;
    while(len > t) {
        while(len > t && !isalpha(s[len])) len--;
        if(len == t) {
            tmp = toInt(s + len + 1);
            break;
        }
        if(tmp == maxn) tmp = toInt(s + len);
        if(mp.count(toIndex(s[len])) && mp[toIndex(s[len])] > tmp && ass.count(toIndex(s[len])) && ass[toIndex(s[len])].count(tmp)) 
            tmp = ass[toIndex(s[len])][tmp];
        else {
            flag = 0;
            break;
        }
        len--;
    }
    if(flag) return tmp;
    else return maxn;
}

ll isLegalL(char s[], int t, int ans) {
    ll tmp = maxn, flag = 1;
    int len = t - 1;
    while(len >= 3) {
        while(len >= 3 && !isalpha(s[len])) len--;
        if(isdigit(s[len])) {
            tmp = toInt(s+2);
            break;
        }
        if(tmp == maxn) tmp = toInt(s + len);
        if(mp.count(toIndex(s[len])) && mp[toIndex(s[len])] > tmp && ass.count(toIndex(s[len])) && ass[toIndex(s[len])].count(tmp)) 
            tmp = ass[toIndex(s[len])][tmp];
        else {
            flag = 0;
            break;
        }
        len--;
    }
    if(flag && mp.count(toIndex(s[0])) && mp[toIndex(s[0])] > tmp) {
        ass[toIndex(s[0])][tmp] = ans;
        return tmp;
    }
    else return maxn;
}

int isLegal(char s[]) {
    int t = strchr(s, '=') - s;
    ll ans = isLegalR(s, t);
    if(ans != maxn) {
        ll tag = isLegalL(s, t, ans);
        if(tag != maxn) return 1;
    }
    return 0; 
}

int main() {
    //ios::sync_with_stdio(false);
    while(cin >> str) {
        ass.clear();mp.clear();
        int cnt = 1;
        int flag = 0;
        if(str[0] == '.') break;
        if(strchr(str, '=') == 0) {
            mp[toIndex(str[0])] = max(toInt(str), mp[toIndex(str[0])]);
        }
        else flag = 1;
        while(cin >> str) {
            cnt++;
            if(str[0] == '.') break;
            if(strchr(str, '=') == 0) {
               mp[toIndex(str[0])] = max(toInt(str), mp[toIndex(str[0])]);
            }
            else {
                int pag = isLegal(str);
                if(pag == 0 && !flag) flag = cnt;
            }
        }
        cout << flag << endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chook_lxk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值