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

#include "bits/stdc++.h"
using namespace std;
#define REP(i, n) for (ll i = 0; i < n; i++)
#define ll long long
#define MOD 1000000007
#define llMAX 9223372036854775807
#define llMIN -9223372036854775808
using vi = vector<ll>;  // intの1次元の型に vi という別名をつける
using vvi = vector<vi>; // intの2次元の型に vvi という別名をつける

// mapの使い方
#include <map>

ll n, x, y;

vi tp(224);
vi ama(224);
/*

void ruiseki(vi &ina,vi &vl,vi &vr){
  for(ll i=0;i<224;i++){
    tp[i]=ina[i]*ama[(i+offset)%224]%2019;
  }
  vl[0]=tp[0];
  for(ll i=1;i<224;i++){
    vl[i]=(vl[i-1]+tp[i])%2019;
  }
  vr[223]=tp[223];
  for(ll i=222;i>=0;i--){
    vr[i]=(vr[i+1]+tp[i])%2019;
  }

}
*/
ll offset;

int main() {
  ll ans = 0;
  string s;
  cin >> s;
  n = s.length();
  vi ama(224);
  ama[0] = 1;
  for (ll i = 1; i < 224; i++) {
    ama[i] = ama[i - 1] * 10 % 2019;
  }
  vi si(n);
  for (ll i = 0; i < n; i++) {
    si[n - 1 - i] = s[i] - 48;
  }

  /*
  for (auto it : nums) {
      long long num = it.second; // it.first が it.second 個ある
      res += num * (num - 1) / 2;
  }
  */
  vi nums2(2019);

  for (ll k = 0; k < 224; k++) {

    // map<long long, long long> nums;
    vi nums(2019);
    ll gk = 0;
    nums[0] = 1;
    for (ll i = 0; i + k < n; i++) {
      gk += ama[i % 224] * si[i + k] % 2019;
      gk %= 2019;
      // 何個あるか
      ans += nums[(2019 - gk) % 2019];
      /*
      for (auto it : nums) {
          // it.first が it.second 個ある
          if ((it.first+gk)%2019==0)ans+=it.second;
      }
      */
      if (i % 224 == 223) {
        // 初期化
        // map<long long, long long> nums2;
        for (ll j = 0; j < 2019; j++) {
          nums2[(j + gk) % 2019] = nums[j];
        }
        nums2[0]++;
        for (ll j = 0; j < 2019; j++) {
          nums[j] = nums2[j];
        }
        gk = 0;
      }
    }
  }

  // offset=n%224;//これを224回やる

  cout << ans << endl;

  return 0;
}

Error: 0

Fixed submission:

#include "bits/stdc++.h"
using namespace std;
#define REP(i, n) for (ll i = 0; i < n; i++)
#define ll long long
#define MOD 1000000007
#define llMAX 9223372036854775807
#define llMIN -9223372036854775808
using vi = vector<ll>;  // intの1次元の型に vi という別名をつける
using vvi = vector<vi>; // intの2次元の型に vvi という別名をつける

// mapの使い方
#include <map>

ll n, x, y;

vi tp(224);
vi ama(224);
/*

void ruiseki(vi &ina,vi &vl,vi &vr){
  for(ll i=0;i<224;i++){
    tp[i]=ina[i]*ama[(i+offset)%224]%2019;
  }
  vl[0]=tp[0];
  for(ll i=1;i<224;i++){
    vl[i]=(vl[i-1]+tp[i])%2019;
  }
  vr[223]=tp[223];
  for(ll i=222;i>=0;i--){
    vr[i]=(vr[i+1]+tp[i])%2019;
  }

}
*/
ll offset;

int main() {
  ll ans = 0;
  string s;
  cin >> s;
  n = s.length();
  vi ama(224);
  ama[0] = 1;
  for (ll i = 1; i < 224; i++) {
    ama[i] = ama[i - 1] * 10 % 2019;
  }
  vi si(n);
  for (ll i = 0; i < n; i++) {
    si[n - 1 - i] = s[i] - 48;
  }

  /*
  for (auto it : nums) {
      long long num = it.second; // it.first が it.second 個ある
      res += num * (num - 1) / 2;
  }
  */
  vi nums2(2019);

  for (ll k = 0; k < 224; k++) {

    // map<long long, long long> nums;
    vi nums(2019);
    ll gk = 0;
    nums[0] = 1;
    for (ll i = 0; i + k < n; i++) {
      gk += ama[i % 224] * si[i + k] % 2019;
      gk %= 2019;
      // 何個あるか
      ans += nums[(2019 - gk) % 2019];
      /*
      for (auto it : nums) {
          // it.first が it.second 個ある
          if ((it.first+gk)%2019==0)ans+=it.second;
      }
      */
      if (i % 224 == 223) {
        // 初期化
        // map<long long, long long> nums2;
        for (ll j = 0; j < 2019; j++) {
          nums2[(i + gk) % 2019] = nums[i];
        }
        nums2[0]++;
        for (ll j = 0; j < 2019; j++) {
          nums[i] = nums2[i];
        }
        gk = 0;
      }
    }
  }

  // offset=n%224;//これを224回やる

  cout << ans << endl;

  return 0;
}