Problem p02962 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <fstream>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
const ll MOD = 1e9 + 7;
int n;
bool used[500001];
int cmp[500001];
vector<int> g[500001], gr[500001];
vector<int> vs;

void dfs(int x) {
  used[x] = 1;
  for (auto y : g[x]) {
    if (!used[y])
      dfs(y);
  }
  vs.push_back(x);
}

void rdfs(int v, int k) {
  used[v] = 1;
  cmp[v] = k;
  for (auto y : gr[v]) {
    if (!used[y])
      rdfs(y, k);
  }
}
int scc() {
  fill(used, used + n, 0);
  vs.clear();
  for (int i = 0; i < n; i++) {
    if (!used[i])
      dfs(i);
  }
  fill(used, used + n, 0);
  int k = 0;
  for (int i = vs.size() - 1; i >= 0; i--) {
    if (!used[vs[i]])
      rdfs(vs[i], k++);
  }
  return k;
}
int dp[500010];
int solve(int x) {
  if (dp[x] >= 0)
    return dp[x];
  int ret = 0;
  for (auto y : g[x]) {
    ret = max(ret, solve(y) + 1);
  }
  return dp[x] = ret;
}
int main() {
  string s, t;
  cin >> s >> t;
  n = s.size();
  int m = t.size();
  string s0 = s;
  while (s0.size() < t.size() + s.size())
    s0 += s;
  ll bs[2000020];
  bs[0] = 0;
  ll b = 67;
  ll bp = 1;
  for (int i = 0; i < s0.size(); i++) {
    bs[i + 1] = (bs[i] + bp * s0[i]) % MOD;
    bp = bp * b % MOD;
  }
  bp = 1;
  ll bt = 0;
  for (int i = 0; i < m; i++) {
    (bt += bp * t[i]) %= MOD;
    bp = bp * b % MOD;
  }
  bp = 1;
  int nx[500010];
  for (int i = 0; i < n; i++) {
    if ((bs[i + m] - bs[i] + MOD) % MOD == bt * bp % MOD) {
      g[i].push_back((i + m) % n);
      gr[(i + m) % n].push_back(i);
      // cout<<i<<" "<<(i+m)%n<<endl;
    }
    bp = bp * b % MOD;
  }
  int k = scc();
  if (k < n) {
    cout << -1 << endl;
    return 0;
  }
  fill(dp, dp + n, -1);
  int ans = 0;
  for (int i = 0; i < n; i++) {
    ans = max(ans, solve(i));
  }
  cout << ans << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <fstream>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
const ll MOD = 1e9 + 7;
int n;
bool used[500001];
int cmp[500001];
vector<int> g[500001], gr[500001];
vector<int> vs;

void dfs(int x) {
  used[x] = 1;
  for (auto y : g[x]) {
    if (!used[y])
      dfs(y);
  }
  vs.push_back(x);
}

void rdfs(int v, int k) {
  used[v] = 1;
  cmp[v] = k;
  for (auto y : gr[v]) {
    if (!used[y])
      rdfs(y, k);
  }
}
int scc() {
  fill(used, used + n, 0);
  vs.clear();
  for (int i = 0; i < n; i++) {
    if (!used[i])
      dfs(i);
  }
  fill(used, used + n, 0);
  int k = 0;
  for (int i = vs.size() - 1; i >= 0; i--) {
    if (!used[vs[i]])
      rdfs(vs[i], k++);
  }
  return k;
}
int dp[500010];
int solve(int x) {
  if (dp[x] >= 0)
    return dp[x];
  int ret = 0;
  for (auto y : g[x]) {
    ret = max(ret, solve(y) + 1);
  }
  return dp[x] = ret;
}
int main() {
  string s, t;
  cin >> s >> t;
  n = s.size();
  int m = t.size();
  string s0 = s;
  while (s0.size() < t.size() + s.size())
    s0 += s;
  ll bs[2000020];
  bs[0] = 0;
  ll b = 67;
  ll bp = 1;
  for (int i = 0; i < s0.size(); i++) {
    bs[i + 1] = (bs[i] + bp * s0[i]) % MOD;
    bp = bp * b % MOD;
  }
  bp = 1;
  ll bt = 0;
  for (int i = 0; i < m; i++) {
    (bt += bp * t[i]) %= MOD;
    bp = bp * b % MOD;
  }
  bp = 1;
  int nx[500010];
  for (int i = 0; i < n; i++) {
    if ((bs[i + m] - bs[i] + MOD) % MOD == bt * bp % MOD) {
      if (i == (i + m) % n) {
        cout << -1 << endl;
        return 0;
      }
      g[i].push_back((i + m) % n);
      gr[(i + m) % n].push_back(i);
      // cout<<i<<" "<<(i+m)%n<<endl;
    }
    bp = bp * b % MOD;
  }
  int k = scc();
  if (k < n) {
    cout << -1 << endl;
    return 0;
  }
  fill(dp, dp + n, -1);
  int ans = 0;
  for (int i = 0; i < n; i++) {
    ans = max(ans, solve(i));
  }
  cout << ans << endl;
  return 0;
}