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

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string>

#define MAX 1000002

int Lv[MAX], A[MAX], newLv[MAX];
int n, k;
std::string T;

bool cmp_Lv(const int i, const int j) { return Lv[i] < Lv[j]; }

bool cmp(const int i, const int j) {
  if (Lv[i] != Lv[j]) {
    return Lv[i] < Lv[j];
  }
  int L_i = (i + k >= n ? -1 : Lv[i + k]);
  int L_j = (j + k >= n ? -1 : Lv[j + k]);

  return L_i < L_j;
}

int main() {
  std::cin >> T;
  n = T.size();

  int i;
  for (i = 0; i < n; i++) {
    A[i] = i;
  }
  for (i = 0; i < n; i++) {
    Lv[i] = T[i];
  }
  std::sort(A, A + n, cmp_Lv);

  newLv[A[0]] = 0;
  for (i = 1; i < n; i++) {
    newLv[A[i]] = newLv[A[i - 1]] + (Lv[A[i]] != Lv[A[i - 1]] ? 1 : 0);
  }
  for (i = 0; i < n; i++) {
    Lv[i] = newLv[i];
  }

  k = 1;
  while (1) {
    if (k > n)
      break;

    std::sort(A, A + n, cmp);
    newLv[A[0]] = 0;
    for (i = 1; i < n; i++) {
      newLv[A[i]] = newLv[A[i - 1]] + (cmp(A[i - 1], A[i]) ? 1 : 0);
    }
    for (i = 0; i < n; i++) {
      Lv[i] = newLv[i];
    }

    if (Lv[A[n - 1]] == n - 1)
      break;
    k <<= 1;
  };

  std::string P;
  int q, left, right, mid, crit;
  bool exist;
  scanf("%d", &q);

  A[n] = n;

  while (q) {
    std::cin >> P;
    left = 0, right = n, exist = false;
    while (left < right) {

      if (n < P.size()) {
        exist = false;
        break;
      }

      mid = (left + right) / 2;
      crit = T.compare(A[mid], P.size(), P);

      if (crit > 0) {
        right = mid;
      } else if (crit < 0) {
        left = mid + 1;
      } else {
        exist = true;
        break;
      }
    };
    if (T.compare(A[right], P.size(), P) == 0)
      exist = true;
    if (exist) {
      printf("1\\n");
    } else {
      printf("0\\n");
    }
    q--;
  }
  return 0;
}

Error: 0

Fixed submission:

#include <iostream>
using namespace std;
#include <algorithm>
#include <cstdio>
#include <string>

string T;
int *A, *lev, *new_lev;
int k, n;

bool cmp_ex(int i, int j) {
  if (T[i] != T[j]) {
    return lev[i] < lev[j];
  }
  return (i + k <= n ? lev[i + k] : -1) < (j + k <= n ? lev[j + k] : -1);
}

int main() {
  int i;
  cin >> T;
  n = T.size();

  A = new int[n + 1];
  lev = new int[n + 1];
  new_lev = new int[n + 1];

  for (i = 0; i < n; i++) {
    A[i] = i;
    lev[i] = T[i];
  }
  A[n] = n, lev[n] = -1;

  k = 1;
  while (1) {
    sort(A, A + n + 1, cmp_ex);

    new_lev[A[0]] = 0;
    for (i = 0; i < n; i++) {
      new_lev[A[i + 1]] = new_lev[A[i]] + (cmp_ex(A[i], A[i + 1]) ? 1 : 0);
    }
    if (new_lev[A[n]] == n)
      break;
    for (i = 0; i <= n; i++)
      lev[i] = new_lev[i];

    k <<= 1;
  };

  int q;
  scanf("%d", &q);
  string P;
  int lp, left, right, mid, crit;
  bool exist;

  while (q) {
    cin >> P;
    lp = P.size();
    left = 1;
    right = n;
    exist = false;
    while (left <= right) {
      if (lp > n)
        break;
      mid = (left + right) / 2;
      crit = T.compare(A[mid], lp, P);
      if (crit > 0) {
        right = mid - 1;
      } else if (crit < 0) {
        left = mid + 1;
      } else {
        exist = true;
        break;
      }
    };
    if (exist) {
      printf("1\\n");
    } else {
      printf("0\\n");
    }
    q--;
  };
  return 0;
}