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

#include <bits/stdc++.h>
using namespace std;
#define il inline
#define re register
#define debug printf("Now is Line : %d\\n", __LINE__)
#define file(a)                                                                \\
  freopen(#a ".in", "r", stdin);                                               \\
  freopen(#a ".out", "w", stdout)
#define rep(i, a, b) for (re int i = (a); i <= (b); ++i)
#define drep(i, a, b) for (re int i = (b); i >= (a); --i)
#define Next(i, u) for (re int i = head[u]; i; i = e[i].next)
#define mem(k, p) memset(k, p, sizeof(k))
#define D double
#define inf 1023456789
#define mod 1000000007
#define lb(x) (x) & (-(x))
il int read() {
  re int x = 0, f = 1;
  re char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    x = x * 10 + c - 48, c = getchar();
  return x * f;
}
#define maxn 1000005
int n, m, ch[maxn][27], rt, cnt, is[1000005][27], ton[27], fa[1000005], pax,
    ans;
struct node {
  string c;
  int len;
} e[maxn];
il bool cmp(node a, node b) { return a.len > b.len; }
il void insert(int &now, int pa, int x) {
  if (x == -1)
    return;
  if (!now)
    now = ++cnt;
  pax = now;
  insert(ch[now][e[pa].c[x] - 'a' + 1], pa, x - 1);
  fa[ch[now][e[pa].c[x] - 'a' + 1]] = now;
}
il int find(int now, int pa, int x) {
  if (x == 0)
    return is[now][e[pa].c[0] - 'a' + 1];
  if (ch[now][e[pa].c[x] - 'a' + 1])
    return find(ch[now][e[pa].c[x] - 'a' + 1], pa, x - 1);
  return 0;
}
signed main() {
  n = read();
  rep(i, 1, n) cin >> e[i].c, e[i].len = e[i].c.size();
  sort(e + 1, e + n + 1, cmp);
  rep(i, 1, n) {
    ans += find(rt, i, e[i].len - 1);
    insert(rt, i, e[i].len - 1);
    rep(j, 0, e[i].len - 1) {
      ton[e[i].c[j] - 'a' + 1] = 1;
      rep(k, 1, 26) is[pax][k] += ton[k];
      pax = fa[pax];
    }
    rep(i, 1, 26) ton[i] = 0;
  }
  cout << ans;
  return 0;
}

Error: -11

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define il inline
#define re register
#define debug printf("Now is Line : %d\\n", __LINE__)
#define file(a)                                                                \\
  freopen(#a ".in", "r", stdin);                                               \\
  freopen(#a ".out", "w", stdout)
#define rep(i, a, b) for (re int i = (a); i <= (b); ++i)
#define drep(i, a, b) for (re int i = (b); i >= (a); --i)
#define Next(i, u) for (re int i = head[u]; i; i = e[i].next)
#define mem(k, p) memset(k, p, sizeof(k))
#define D double
#define inf 1023456789
#define mod 1000000007
#define lb(x) (x) & (-(x))
il int read() {
  re int x = 0, f = 1;
  re char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    x = x * 10 + c - 48, c = getchar();
  return x * f;
}
#define maxn 200005
int n, m, ch[maxn][27], rt, cnt, is[1000005][27], ton[27], fa[1000005], pax,
    ans;
struct node {
  string c;
  int len;
} e[maxn];
il bool cmp(node a, node b) { return a.len > b.len; }
il void insert(int &now, int pa, int x) {
  if (x == -1)
    return;
  if (!now)
    now = ++cnt;
  pax = now;
  insert(ch[now][e[pa].c[x] - 'a' + 1], pa, x - 1);
  fa[ch[now][e[pa].c[x] - 'a' + 1]] = now;
}
il int find(int now, int pa, int x) {
  if (x == 0)
    return is[now][e[pa].c[0] - 'a' + 1];
  if (ch[now][e[pa].c[x] - 'a' + 1])
    return find(ch[now][e[pa].c[x] - 'a' + 1], pa, x - 1);
  return 0;
}
signed main() {
  n = read();
  rep(i, 1, n) cin >> e[i].c, e[i].len = e[i].c.size();
  sort(e + 1, e + n + 1, cmp);
  rep(i, 1, n) {
    ans += find(rt, i, e[i].len - 1);
    insert(rt, i, e[i].len - 1);
    drep(j, 0, e[i].len - 1) {
      ton[e[i].c[j] - 'a' + 1] = 1;
      rep(k, 1, 26) is[pax][k] += ton[k];
      pax = fa[pax];
    }
    rep(i, 1, 26) ton[i] = 0;
  }
  cout << ans;
  return 0;
}