Problem p02962 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
#define DUMP(x) cout << #x << " = " << (x) << endl;
#define FOR(i, m, n) for (ll i = m; i < n; i++)
#define IFOR(i, m, n) for (ll i = n - 1; i >= m; i--)
#define REP(i, n) FOR(i, 0, n)
#define IREP(i, n) IFOR(i, 0, n)
#define FOREACH(x, a) for (auto &(x) : (a))
#define ALL(v) (v).begin(), (v).end()
#define SZ(x) ll(x.size())

vector<ll> Zalgo(const string &S) {
  ll N = SZ(S);
  vector<ll> res(N);
  res[0] = N;
  ll i = 1, j = 0;
  while (i < N) {
    while (i + j < N && S[j] == S[i + j])
      ++j;
    res[i] = j;
    if (j == 0) {
      ++i;
      continue;
    }
    ll k = 1;
    while (i + k < N && k + res[k] < j)
      res[i + k] = res[k], ++k;
    i += k, j -= k;
  }
  return res;
}

int main() {
  string s, t;
  cin >> s >> t;
  ll m = SZ(s), n = SZ(t);
  string u = s;
  while (SZ(u) <= m + n - 1) {
    u = u + s;
  }
  u = t + u;
  auto lcp = Zalgo(u);
  vector<vector<ll>> to(m);
  vector<ll> deg(m, 0);
  REP(i, m) {
    if (lcp[i + n] >= n) {
      ll j = (i + n) % m;
      to[i].push_back(j);
      deg[j]++;
    }
  }
  stack<ll> st;
  REP(i, m) if (deg[i] == 0) st.push(i);
  // dp[i] = 頂点iを始点とするパス長の最大値
  vector<ll> topo, dp(m, 0);
  while (!st.empty()) {
    ll cv = st.top();
    st.pop();
    topo.push_back(cv);
    FOREACH(nv, to[cv]) {
      deg[nv]--;
      dp[nv] = max(dp[nv], dp[cv] + 1);
      if (deg[nv] == 0)
        st.push(nv);
    }
  }

  // トポロジカルソート列に全頂点が格納されていない場合，閉路がある
  if (SZ(topo) != m) {
    cout << -1 << endl;
    return 0;
  }
  cout << *max_element(ALL(dp)) << endl;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
#define DUMP(x) cout << #x << " = " << (x) << endl;
#define FOR(i, m, n) for (ll i = m; i < n; i++)
#define IFOR(i, m, n) for (ll i = n - 1; i >= m; i--)
#define REP(i, n) FOR(i, 0, n)
#define IREP(i, n) IFOR(i, 0, n)
#define FOREACH(x, a) for (auto &(x) : (a))
#define ALL(v) (v).begin(), (v).end()
#define SZ(x) ll(x.size())

vector<ll> Zalgo(const string &S) {
  ll N = SZ(S);
  vector<ll> res(N);
  res[0] = N;
  ll i = 1, j = 0;
  while (i < N) {
    while (i + j < N && S[j] == S[i + j])
      ++j;
    res[i] = j;
    if (j == 0) {
      ++i;
      continue;
    }
    ll k = 1;
    while (i + k < N && k + res[k] < j)
      res[i + k] = res[k], ++k;
    i += k, j -= k;
  }
  return res;
}

int main() {
  string s, t;
  cin >> s >> t;
  ll m = SZ(s), n = SZ(t);
  string u = s;
  while (SZ(u) <= m + n - 1) {
    u = u + u;
  }
  u = t + u;
  auto lcp = Zalgo(u);
  vector<vector<ll>> to(m);
  vector<ll> deg(m, 0);
  REP(i, m) {
    if (lcp[i + n] >= n) {
      ll j = (i + n) % m;
      to[i].push_back(j);
      deg[j]++;
    }
  }
  stack<ll> st;
  REP(i, m) if (deg[i] == 0) st.push(i);
  // dp[i] = 頂点iを始点とするパス長の最大値
  vector<ll> topo, dp(m, 0);
  while (!st.empty()) {
    ll cv = st.top();
    st.pop();
    topo.push_back(cv);
    FOREACH(nv, to[cv]) {
      deg[nv]--;
      dp[nv] = max(dp[nv], dp[cv] + 1);
      if (deg[nv] == 0)
        st.push(nv);
    }
  }

  // トポロジカルソート列に全頂点が格納されていない場合，閉路がある
  if (SZ(topo) != m) {
    cout << -1 << endl;
    return 0;
  }
  cout << *max_element(ALL(dp)) << endl;
  return 0;
}