Problem p04018 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

using int64 = long long;

template <unsigned mod> struct RollingHash {
  vector<unsigned> hashed, power;

  inline unsigned mul(unsigned a, unsigned b) const {
    unsigned long long x = (unsigned long long)a * b;
    unsigned xh = (unsigned)(x >> 32), xl = (unsigned)x, d, m;
    asm("divl %4; \n\t" : "=a"(d), "=d"(m) : "d"(xh), "a"(xl), "r"(mod));
    return m;
  }

  RollingHash(const string &s, unsigned base = 10007) {
    int sz = (int)s.size();
    hashed.assign(sz + 1, 0);
    power.assign(sz + 1, 0);
    power[0] = 1;
    for (int i = 0; i < sz; i++) {
      power[i + 1] = mul(power[i], base);
      hashed[i + 1] = mul(hashed[i], base) + s[i];
      if (hashed[i + 1] >= mod)
        hashed[i + 1] -= mod;
    }
  }

  unsigned get(int l, int r) const {
    unsigned ret = hashed[r] + mod - mul(hashed[l], power[r - l]);
    if (ret >= mod)
      ret -= mod;
    return ret;
  }

  unsigned connect(unsigned h1, int h2, int h2len) const {
    unsigned ret = mul(h1, power[h2len]) + h2;
    if (ret >= mod)
      ret -= mod;
    return ret;
  }

  int LCP(const RollingHash<mod> &b, int l1, int r1, int l2, int r2) {
    int len = min(r1 - l1, r2 - l2);
    int low = -1, high = len + 1;
    while (high - low > 1) {
      int mid = (low + high) / 2;
      if (get(l1, l1 + mid) == b.get(l2, l2 + mid))
        low = mid;
      else
        high = mid;
    }
    return (low);
  }
};

using RH1 = RollingHash<1000000007>;
using RH2 = RollingHash<1000000009>;
using Pi = pair<unsigned, unsigned>;

vector<int> get_span(string w) {
  vector<int> span(w.size());
  RH1 latte(w);
  RH2 malta(w);
  for (int i = 1; i < w.size(); i++) {
    Pi p(latte.get(0, i), malta.get(0, i));
    for (int j = i + i; j <= w.size(); j += i) {
      if (Pi(latte.get(j - i, j), malta.get(j - i, j)) == p) {
        span[j - 1] = true;
      } else {
        break;
      }
    }
  }
  return span;
}

int main() {

  string w;
  cin >> w;

  auto latte = get_span(w);
  reverse(begin(w), end(w));
  auto malta = get_span(w);
  reverse(begin(malta), end(malta));

  if (latte.back() == 0) {
    cout << 1 << endl;
    cout << 1 << endl;
    return 0;
  }

  int ret = 0;
  for (int i = 0; i + 1 < w.size(); i++) {
    if (!latte[i] && !malta[i + 1])
      ++ret;
  }

  if (ret > 0) {
    cout << 2 << endl;
    cout << ret << endl;
    return 0;
  }

  // えーこれわかんねえ
  throw 0;
}

Fixed submission:
#include <bits/stdc++.h>

using namespace std;

using int64 = long long;

template <unsigned mod> struct RollingHash {
  vector<unsigned> hashed, power;

  inline unsigned mul(unsigned a, unsigned b) const {
    unsigned long long x = (unsigned long long)a * b;
    unsigned xh = (unsigned)(x >> 32), xl = (unsigned)x, d, m;
    asm("divl %4; \n\t" : "=a"(d), "=d"(m) : "d"(xh), "a"(xl), "r"(mod));
    return m;
  }

  RollingHash(const string &s, unsigned base = 10007) {
    int sz = (int)s.size();
    hashed.assign(sz + 1, 0);
    power.assign(sz + 1, 0);
    power[0] = 1;
    for (int i = 0; i < sz; i++) {
      power[i + 1] = mul(power[i], base);
      hashed[i + 1] = mul(hashed[i], base) + s[i];
      if (hashed[i + 1] >= mod)
        hashed[i + 1] -= mod;
    }
  }

  unsigned get(int l, int r) const {
    unsigned ret = hashed[r] + mod - mul(hashed[l], power[r - l]);
    if (ret >= mod)
      ret -= mod;
    return ret;
  }

  unsigned connect(unsigned h1, int h2, int h2len) const {
    unsigned ret = mul(h1, power[h2len]) + h2;
    if (ret >= mod)
      ret -= mod;
    return ret;
  }

  int LCP(const RollingHash<mod> &b, int l1, int r1, int l2, int r2) {
    int len = min(r1 - l1, r2 - l2);
    int low = -1, high = len + 1;
    while (high - low > 1) {
      int mid = (low + high) / 2;
      if (get(l1, l1 + mid) == b.get(l2, l2 + mid))
        low = mid;
      else
        high = mid;
    }
    return (low);
  }
};

using RH1 = RollingHash<1000000007>;
using RH2 = RollingHash<1000000009>;
using Pi = pair<unsigned, unsigned>;

vector<int> get_span(string w) {
  vector<int> span(w.size());
  RH1 latte(w);
  RH2 malta(w);
  for (int i = 1; i < w.size(); i++) {
    Pi p(latte.get(0, i), malta.get(0, i));
    for (int j = i + i; j <= w.size(); j += i) {
      if (Pi(latte.get(j - i, j), malta.get(j - i, j)) == p) {
        span[j - 1] = true;
      } else {
        break;
      }
    }
  }
  return span;
}

int main() {

  string w;
  cin >> w;

  auto latte = get_span(w);
  reverse(begin(w), end(w));
  auto malta = get_span(w);
  reverse(begin(malta), end(malta));

  if (latte.back() == 0) {
    cout << 1 << endl;
    cout << 1 << endl;
    return 0;
  }

  int ret = 0;
  for (int i = 0; i + 1 < w.size(); i++) {
    if (!latte[i] && !malta[i + 1])
      ++ret;
  }

  if (ret > 0) {
    cout << 2 << endl;
    cout << ret << endl;
    return 0;
  }

  bool same = true;
  for (int i = 1; i < w.size(); i++) {
    if (w[i - 1] != w[i])
      same = false;
  }

  if (same) {
    cout << w.size() << endl;
    cout << 1 << endl;
    return 0;
  }

  // えーこういう場面どうするんや　人生終わり
  throw 0;
}