Problem p02962 (C++)

Buggy submission (status: Runtime Error):
// Words are flowing out like endless rain into a paper cup
// They slither while they pass they slip away across the universe
// Pools of sorrow, waves of joy are drifting through my open mind
// Possessing and caressing me

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

using LL = long long;

namespace _buff {

const size_t BUFF = 1 << 19;
char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
char getc() {
  if (ib == ie) {
    ib = ibuf;
    ie = ibuf + fread(ibuf, 1, BUFF, stdin);
  }
  return ib == ie ? -1 : *ib++;
}

} // namespace _buff

LL read() {
  using namespace _buff;
  LL ret = 0;
  bool pos = true;
  char c = getc();
  for (; (c < '0' || c > '9') && c != '-'; c = getc()) {
    assert(~c);
  }
  if (c == '-') {
    pos = false;
    c = getc();
  }
  for (; c >= '0' && c <= '9'; c = getc()) {
    ret = (ret << 3) + (ret << 1) + (c ^ 48);
  }
  return pos ? ret : -ret;
}

template <typename T> void chkmax(T &dp, const T &val) {
  if (val > dp)
    dp = val;
}

const size_t N = 3e5 + 5;

char s[N], ss[N], t[N];
int ls, lt, z[N], indeg[N], dis[N];
bool ok[N];
vector<int> g[N];

void z_func(char s[], int z[]) {
  int len = strlen(s);
  for (int i = 1, l = 0, r = 0; i < len; ++i) {
    if (i < r) {
      z[i] = min(z[i - l], r - i);
    }
    for (; i + z[i] < len && s[i + z[i]] == s[z[i]]; ++z[i]) {
    }
    if (r <= i + z[i]) {
      l = i;
      r = i + z[i];
    }
  }
}

int main() {
  scanf("%s%s", s, t);
  ls = strlen(s);
  lt = strlen(t);
  copy(t, t + lt, ss);
  for (int i = 0, j = lt; j < N - 1; (++i) %= ls, ++j) {
    ss[j] = s[i];
  }
  z_func(ss, z);
  int cnt = 0;
  for (int i = 0; i < ls; ++i) {
    if (z[i + lt] >= lt) {
      cnt += ok[i] = true;
    }
  }
  if (!cnt) {
    return puts("0"), 0;
  }
  for (int i = 0; i < ls; ++i) {
    if (ok[i] && ok[(i + lt) % ls]) {
      g[i].emplace_back((i + lt) % ls);
      ++indeg[(i + lt) % ls];
    }
  }

  static int que[N];
  int ql = 0, qr = 0;
  for (int i = 0; i < ls; ++i) {
    if (ok[i] && !indeg[i]) {
      dis[i] = 1;
      que[qr++] = i;
    }
  }
  int ans = 0;
  while (ql < qr) {
    int x = que[ql++];
    chkmax(ans, dis[x]);
    for (int y : g[x]) {
      chkmax(dis[y], dis[x] + 1);
      if (!(--indeg[y])) {
        que[qr++] = y;
      }
    }
  }
  if (qr < cnt)
    ans = -1;
  cout << ans << '\n';
  return 0;
}

Fixed submission:
// Words are flowing out like endless rain into a paper cup
// They slither while they pass they slip away across the universe
// Pools of sorrow, waves of joy are drifting through my open mind
// Possessing and caressing me

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

using LL = long long;

namespace _buff {

const size_t BUFF = 1 << 19;
char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
char getc() {
  if (ib == ie) {
    ib = ibuf;
    ie = ibuf + fread(ibuf, 1, BUFF, stdin);
  }
  return ib == ie ? -1 : *ib++;
}

} // namespace _buff

LL read() {
  using namespace _buff;
  LL ret = 0;
  bool pos = true;
  char c = getc();
  for (; (c < '0' || c > '9') && c != '-'; c = getc()) {
    assert(~c);
  }
  if (c == '-') {
    pos = false;
    c = getc();
  }
  for (; c >= '0' && c <= '9'; c = getc()) {
    ret = (ret << 3) + (ret << 1) + (c ^ 48);
  }
  return pos ? ret : -ret;
}

template <typename T> void chkmax(T &dp, const T &val) {
  if (val > dp)
    dp = val;
}

const size_t N = 1.5e6 + 5;

char s[N], ss[N], t[N];
int ls, lt, z[N], indeg[N], dis[N];
bool ok[N];
vector<int> g[N];

void z_func(char s[], int z[]) {
  int len = strlen(s);
  for (int i = 1, l = 0, r = 0; i < len; ++i) {
    if (i < r) {
      z[i] = min(z[i - l], r - i);
    }
    for (; i + z[i] < len && s[i + z[i]] == s[z[i]]; ++z[i]) {
    }
    if (r <= i + z[i]) {
      l = i;
      r = i + z[i];
    }
  }
}

int main() {
  scanf("%s%s", s, t);
  ls = strlen(s);
  lt = strlen(t);
  copy(t, t + lt, ss);
  for (int i = 0, j = lt; j < N - 1; (++i) %= ls, ++j) {
    ss[j] = s[i];
  }
  z_func(ss, z);
  int cnt = 0;
  for (int i = 0; i < ls; ++i) {
    if (z[i + lt] >= lt) {
      cnt += ok[i] = true;
    }
  }
  if (!cnt) {
    return puts("0"), 0;
  }
  for (int i = 0; i < ls; ++i) {
    if (ok[i] && ok[(i + lt) % ls]) {
      g[i].emplace_back((i + lt) % ls);
      ++indeg[(i + lt) % ls];
    }
  }

  static int que[N];
  int ql = 0, qr = 0;
  for (int i = 0; i < ls; ++i) {
    if (ok[i] && !indeg[i]) {
      dis[i] = 1;
      que[qr++] = i;
    }
  }
  int ans = 0;
  while (ql < qr) {
    int x = que[ql++];
    chkmax(ans, dis[x]);
    for (int y : g[x]) {
      chkmax(dis[y], dis[x] + 1);
      if (!(--indeg[y])) {
        que[qr++] = y;
      }
    }
  }
  if (qr < cnt)
    ans = -1;
  cout << ans << '\n';
  return 0;
}