Problem p00861 (C++) — buggy submission, verdict: Runtime Error

// #define __USE_MINGW_ANSI_STDIO 0
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<ll> VL;
typedef vector<VL> VVL;
typedef pair<int, int> PII;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define IN(a, b, x) (a <= x && x < b)
#define MP make_pair
#define PB push_back
#define MOD 1000000007
#define INF (1LL << 30)
#define LLINF (1LL << 60)
#define PI 3.14159265359
#define EPS 1e-12
// #define int ll

int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

typedef string::const_iterator State;
class ParseError {};
int number(State &);
int expression(State &);

int len[60];
map<pair<char, int>, int> memo;
//??£?¨???¨?????????????????????
pair<char, int> declara(State &begin) {
  int n = -1;
  char c = '-';
  while (1) {
    // cout << *begin << endl;
    if (islower(*begin) || isupper(*begin)) {
      c = *begin;
      begin++;
    } else if (*begin == '[') {
      begin++;
      n = number(begin);
      begin++;
    } else {
      break;
    }
  }
  // cout << "de:" << c << " " << n << endl;
  return {c, n};
}

pair<char, int> assign(State &begin) {
  char c = '-';
  int n = -1;
  while (1) {
    // cout << "assign:" << *begin << endl;
    if (islower(*begin) || isupper(*begin)) {
      c = *begin;
      begin++;
    } else if (*begin == '[') {
      begin++;
      n = expression(begin);
      begin++;
    } else {
      break;
    }
  }

  // c[n]???????????????
  if (islower(c)) {
    if (len[c - 'a'] <= n)
      return {'-', -1};
    return {c, n};
  } else {
    if (len[c - 'A' + 26] <= n)
      return {'-', -1};
    return {c, n};
  }
}

int expression(State &begin) {
  char c = '-';
  int n = -1;
  while (1) {
    if (isdigit(*begin)) {
      n = number(begin);
    } else if (islower(*begin) || isupper(*begin)) {
      c = *begin;
      begin++;
    } else if (*begin == '[') {
      begin++;
      n = expression(begin);
      begin++;
    } else {
      break;
    }
  }

  // c[n]???????????????
  if (islower(c)) {
    auto itr = memo.find(MP(c, n));
    if (len[c - 'a'] <= n || itr == memo.end())
      return -1;
    return memo[MP(c, n)];
  } else if (isupper(c)) {
    auto itr = memo.find(MP(c, n));
    if (len[c - 'A' + 26] <= n || itr == memo.end())
      return -1;
    return memo[MP(c, n)];
  } else {
    return n;
  }
}

int number(State &begin) {
  int ret = 0;
  while (isdigit(*begin)) {
    ret *= 10;
    ret += *begin - '0';
    begin++;
  }
  return ret;
}

string s[1010];
signed main(void) {
  int cc = 0;
  while (true) {
    cin >> s[cc];
    // cout << "cc" << cc << endl;
    //  s???"."???????????????????§?
    if (s[cc] == ".") {
      //????????°????????????
      if (cc == 0)
        break;
      memset(len, 0, sizeof(len));
      memo.erase(ALL(memo));
      int bug = 0;
      REP(i, cc + 1) {
        // cout << "i:" << i << " " << s[i] << endl;
        //??£?¨??????£??\\????????????
        size_t idx = s[i].find('=');
        if (idx == string::npos) {
          State begin = s[i].begin();
          pair<char, int> ans = declara(begin);
          // cout << ans.first << " " << ans.second << endl;
          if (islower(ans.first)) {
            len[ans.first - 'a'] = ans.second;
          } else {
            len[ans.first - 'A' + 26] = ans.second;
          }
        } else {
          string left = s[i].substr(0, idx), right = s[i].substr(idx + 1);
          State beginl = left.begin(), beginr = right.begin();
          pair<char, int> ansleft = assign(beginl);
          int ansright = expression(beginr);
          // cout << ansleft.first << " " << ansleft.second << " " << ansright
          // << endl;
          if (ansleft.second < 0 || ansright < 0) {
            if (bug == 0) {
              bug = i + 1;
              break;
            }
          } else {
            memo[MP(ansleft.first, ansleft.second)] = ansright;
          }
        }
      }
      cout << bug << endl;
      cc = 0;
      continue;
    }
    cc++;
  }

  /*int cnt = 1, ans = 0;
  REP(i, 60) len[i] = 0;
  memo.erase(ALL(memo));
  while(true) {
          //cout << "cnt" << cnt << endl;
          // s??????????????????
          State begin = s.begin();
          // ??£?¨??????£??\\????????????
          int idx = -1;
          REP(i, s.size()) {
                  // = ????????¨?????????
                  if(s[i] == '=') {
                          idx = i;
                  }
          }
          // ??£?¨?
          if(idx == -1) {
                  pair<char, int> ans1 = declara(begin);
                  cout << ans1.first << " " << ans1.second << endl;
                  //?????°??£?????????????¢?????????£?¨???????????????????
                  if(islower(ans1.first)) {
                          len[ans1.first-'a'] = ans1.second;
                  } else {
                          len[ans1.first-'A'+26] = ans1.second;
                  }
          } else {
                  // ??£??\\
                  // = ???????????§?????????????????????????????????
                  string tmp2 = s.substr(0, idx), tmp3 = s.substr(idx+1);
                  //cout << tmp2 << " " << tmp3 << endl;
                  State begin2 = tmp2.begin(), begin3 = tmp3.begin();
                  pair<char, int> ans2 = assign(begin2);
                  int ans3 = expression(begin3);
                  cout << ans2.first << " " << ans2.second << " " << ans3 <<
endl; if(ans2.second < 0 || ans3 < 0) { if(ans == 0) ans = cnt; } else {
                          memo[MP(ans2.first, ans2.second)] = ans3;
                  }
          }
          cnt++;
          cin >> s;
          if(s == ".") break;
  }
  cout << ans << "\\n";
}*/

  return 0;
}

Error: 0

Fixed submission:

// #define __USE_MINGW_ANSI_STDIO 0
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<ll> VL;
typedef vector<VL> VVL;
typedef pair<int, int> PII;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define IN(a, b, x) (a <= x && x < b)
#define MP make_pair
#define PB push_back
#define MOD 1000000007
#define INF (1LL << 30)
#define LLINF (1LL << 60)
#define PI 3.14159265359
#define EPS 1e-12
// #define int ll

int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

typedef string::const_iterator State;
class ParseError {};
int number(State &);
int expression(State &);

int len[60];
map<pair<char, int>, int> memo;
//??£?¨???¨?????????????????????
pair<char, int> declara(State &begin) {
  int n;
  char c;
  while (1) {
    // cout << *begin << endl;
    if (islower(*begin) || isupper(*begin)) {
      c = *begin;
      begin++;
    } else if (*begin == '[') {
      begin++;
      n = number(begin);
      begin++;
    } else {
      break;
    }
  }
  // cout << "de:" << c << " " << n << endl;
  return {c, n};
}

pair<char, int> assign(State &begin) {
  char c;
  int n;
  while (1) {
    // cout << "assign:" << *begin << endl;
    if (islower(*begin) || isupper(*begin)) {
      c = *begin;
      begin++;
    } else if (*begin == '[') {
      begin++;
      n = expression(begin);
      begin++;
    } else {
      break;
    }
  }

  // c[n]???????????????
  if (islower(c)) {
    if (len[c - 'a'] <= n)
      return {'-', -1};
    return {c, n};
  } else {
    if (len[c - 'A' + 26] <= n)
      return {'-', -1};
    return {c, n};
  }
}

int expression(State &begin) {
  char c = '-';
  int n;
  while (1) {
    if (isdigit(*begin)) {
      n = number(begin);
    } else if (islower(*begin) || isupper(*begin)) {
      c = *begin;
      begin++;
    } else if (*begin == '[') {
      begin++;
      n = expression(begin);
      begin++;
    } else {
      break;
    }
  }

  // c[n]???????????????
  if (islower(c)) {
    auto itr = memo.find(MP(c, n));
    if (len[c - 'a'] <= n || itr == memo.end())
      return -1;
    return memo[MP(c, n)];
  } else if (isupper(c)) {
    auto itr = memo.find(MP(c, n));
    if (len[c - 'A' + 26] <= n || itr == memo.end())
      return -1;
    return memo[MP(c, n)];
  } else {
    return n;
  }
}

int number(State &begin) {
  int ret = 0;
  while (isdigit(*begin)) {
    ret *= 10;
    ret += *begin - '0';
    begin++;
  }
  return ret;
}

string s[1010];
signed main(void) {
  int cc = 0;
  while (true) {
    cin >> s[cc];
    // cout << "cc" << cc << endl;
    //  s???"."???????????????????§?
    if (s[cc] == ".") {
      //????????°????????????
      if (cc == 0)
        break;
      memset(len, 0, sizeof(len));
      memo.erase(ALL(memo));
      int bug = 0;
      REP(i, cc + 1) {
        // cout << "i:" << i << " " << s[i] << endl;
        //??£?¨??????£??\\????????????
        size_t idx = s[i].find('=');
        if (idx == string::npos) {
          State begin = s[i].begin();
          pair<char, int> ans = declara(begin);
          // cout << ans.first << " " << ans.second << endl;
          if (islower(ans.first)) {
            len[ans.first - 'a'] = ans.second;
          } else {
            len[ans.first - 'A' + 26] = ans.second;
          }
        } else {
          string left = s[i].substr(0, idx), right = s[i].substr(idx + 1);
          State beginl = left.begin(), beginr = right.begin();
          pair<char, int> ansleft = assign(beginl);
          int ansright = expression(beginr);
          // cout << ansleft.first << " " << ansleft.second << " " << ansright
          // << endl;
          if (ansleft.second < 0 || ansright < 0) {
            if (bug == 0) {
              bug = i + 1;
              break;
            }
          } else {
            memo[MP(ansleft.first, ansleft.second)] = ansright;
          }
        }
      }
      cout << bug << endl;
      cc = 0;
      continue;
    }
    cc++;
  }

  /*int cnt = 1, ans = 0;
  REP(i, 60) len[i] = 0;
  memo.erase(ALL(memo));
  while(true) {
          //cout << "cnt" << cnt << endl;
          // s??????????????????
          State begin = s.begin();
          // ??£?¨??????£??\\????????????
          int idx = -1;
          REP(i, s.size()) {
                  // = ????????¨?????????
                  if(s[i] == '=') {
                          idx = i;
                  }
          }
          // ??£?¨?
          if(idx == -1) {
                  pair<char, int> ans1 = declara(begin);
                  cout << ans1.first << " " << ans1.second << endl;
                  //?????°??£?????????????¢?????????£?¨???????????????????
                  if(islower(ans1.first)) {
                          len[ans1.first-'a'] = ans1.second;
                  } else {
                          len[ans1.first-'A'+26] = ans1.second;
                  }
          } else {
                  // ??£??\\
                  // = ???????????§?????????????????????????????????
                  string tmp2 = s.substr(0, idx), tmp3 = s.substr(idx+1);
                  //cout << tmp2 << " " << tmp3 << endl;
                  State begin2 = tmp2.begin(), begin3 = tmp3.begin();
                  pair<char, int> ans2 = assign(begin2);
                  int ans3 = expression(begin3);
                  cout << ans2.first << " " << ans2.second << " " << ans3 <<
endl; if(ans2.second < 0 || ans3 < 0) { if(ans == 0) ans = cnt; } else {
                          memo[MP(ans2.first, ans2.second)] = ans3;
                  }
          }
          cnt++;
          cin >> s;
          if(s == ".") break;
  }
  cout << ans << "\\n";
}*/

  return 0;
}