【习题 5-9 UVA - 1596】Bug Hunt

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


map模拟
map<string,int>记录每个数组的大小
map <pair<string, int> ,int>记录数组的某个下标的值。
递归处理嵌套的情况就好

【代码】

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

string s;
map <string, int> mmap;
map <pair<string, int> ,int> mmap2;
int cur = 0;
bool ok;
int gl(int l, int r)
{
    return r - l + 1;
}

pair <string, string> cl(string s)
{
    string val = "", temp = "";
    int now = 0;
    while (s[now] != '[') val += s[now++];
    int len = s.size();
    temp = s.substr(now + 1, gl(now + 1, len - 2));
    return make_pair(val, temp);
}

int get_num(string s)
{
    if (isdigit(s[0]))
    {
        int x = 0, lens = s.size();
        for (int i = 0; i < lens; i++)
            x = x * 10 + s[i] - '0';
        return x;
    }
    string val = "";
    int len = s.size(),l;
    for (int i = 0; i < len; i++)
    {
        if (s[i] == '[')
        {
            l = i;
            break;
        }
        val += s[i];
    }
    int nex = get_num(s.substr(l + 1, gl(l + 1, len - 2)) );
    if (nex >= mmap[val] || nex < 0)
    {
        ok = false;
        return -1;
    }
    else
    {
        if (mmap2.find(make_pair(val, nex)) != mmap2.end())
        {
            return mmap2[make_pair(val, nex)];
        }
        else
        {
            ok = false;
            return -1;
        }
    }
}

int main()
{
    //freopen("F:\\rush.txt", "r", stdin);
    while (cin >> s && s[0] != '.')
    {
        mmap.clear();
        mmap2.clear();
        ok = true;
        cur = 1;
        while (s[0] != '.')
        {
            if (!ok)
            {
                cin >> s;
                continue;
            }
            int fi = s.find('=', 0);
            if (fi != -1)// a=b
            {
                string s1 = s.substr(0, fi);
                string s2 = s.substr(fi + 1);
                
                pair <string, string> temp = cl(s1);
                s1 = temp.second;
                string a = temp.first;

                int x = get_num(s1), y = get_num(s2);
                if (!ok || x < 0 || x >= mmap[a])
                {
                    ok = 0;
                    cout << cur << endl;
                    continue;
                }
                mmap2[make_pair(a, x)] = y;
            }
            else 
            {
                pair <string, string> temp = cl(s);
                mmap[temp.first] = get_num(temp.second);
            }

            cur++;
            cin >> s; 
        }
        if (ok) cout << 0 << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值