Problem p02855 (C++)

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

using namespace std;
using ll = long long;
using db = double;
using vll = vector<long long>;

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
#define che(a, string) cout << "//" << string << "==" << (a) << "//" << endl;
#define SORT(a) sort((a).begin(), (a).end())
#define rSORT(a) reverse((a).begin(), (a).end())
#define For(i, a, b) for (int i = (a); i < (b); ++i)
#define rep(i, n) For(i, 0, n)
#define leftunique(a)                                                          \
  {                                                                            \
    SORT(a);                                                                   \
    (a).erase(unique((a).begin(), (a).end()), (a).end());                      \
  }
// leftuniqueは配列から同じ要素のものを取り除く 例 4 6 2 1 3 4 1 2 なら 1 2 3 4
// 6 になる
#define debug(x) cout << #x << " = " << (x) << endl;
bool IsInt(double a) {
  int b = a / 1;
  if (a == b) {
    return true;
  } else {
    return false;
  }
}
bool coY() { cout << "Yes" << endl; }
bool coN() { cout << "No" << endl; }
const int mod = 1e9 + 7;
const ll INF = 1LL << 60;
// a^n mod を計算する
long long modpow(long long a, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}
// グラフ用
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
// ここから書き始める

ll combination(ll n, ll i) {
  ll count = 0;
  ll multi = 1;
  ll div = 1;
  int limit = i;
  while (count < limit) {
    multi *= n;
    n--;
    multi /= count + 1;
    count++;
  }
  return multi / div;
}

int main() {
  cout << setprecision(10);
  ll h, w, k;
  cin >> h >> w >> k;
  vector<string> field(h);
  rep(i, h) { cin >> field[i]; }
  vector<vector<ll>> ans(h, vector<ll>(w));

  // 入力ok.それぞれのfieldは、次の#が出てくる手前までの区画でやればいい
  // イチゴがない場所を覚えておく
  vector<bool> ichigo(h, false);

  ll firstLine = -1;
  rep(i, h) {
    rep(j, w) {
      if (field[i][j] == '#') {
        if (firstLine == -1) {
          firstLine = i; // イチゴが最初に出てきたのは何行目か。
        } else {
          ichigo[i] = true;
          break;
        }
      }
    }
  }

  ll count = 0;
  for (int i = firstLine; i < h; i++) { // イチゴが出てきたラインから作
    bool onetime = false; // 行ごとに2回目出てくるまでは前の行＋1
    // 行が変わったとき、その行にイチゴがあるんだったら＋1
    if (ichigo[i])
      count++;
    rep(j, w) {
      if (ichigo[i] == false) { // イチゴがないんだったら、上のものをそのまま使う
        ans[i][j] = ans[i - 1][j];
      } else {
        if (field[i][j] == '#' && onetime) {
          count++;
          ans[i][j] = count;
        } else if (field[i][j] == '#') {
          ans[i][j] = count;
          onetime = true;
        } else {
          ans[i][j] = count;
        }
      }
    }
    // 行が変わるごとに、その行にイチゴがあるんだったらカウントを++する
  }

  // firstline より前を構築していく
  for (int i = firstLine - 1; i >= 0; i--) {
    rep(j, w) { ans[i][j] = ans[i + 1][j]; }
  }
  rep(i, h) {
    rep(j, w) { cout << ans[i][j] << " "; }
    cout << endl;
  }
  // 一行目日以後がなければ、全部j
}


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

using namespace std;
using ll = long long;
using db = double;
using vll = vector<long long>;

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
#define che(a, string) cout << "//" << string << "==" << (a) << "//" << endl;
#define SORT(a) sort((a).begin(), (a).end())
#define rSORT(a) reverse((a).begin(), (a).end())
#define For(i, a, b) for (int i = (a); i < (b); ++i)
#define rep(i, n) For(i, 0, n)
#define leftunique(a)                                                          \
  {                                                                            \
    SORT(a);                                                                   \
    (a).erase(unique((a).begin(), (a).end()), (a).end());                      \
  }
// leftuniqueは配列から同じ要素のものを取り除く 例 4 6 2 1 3 4 1 2 なら 1 2 3 4
// 6 になる
#define debug(x) cout << #x << " = " << (x) << endl;
bool IsInt(double a) {
  int b = a / 1;
  if (a == b) {
    return true;
  } else {
    return false;
  }
}
bool coY() { cout << "Yes" << endl; }
bool coN() { cout << "No" << endl; }
const int mod = 1e9 + 7;
const ll INF = 1LL << 60;
// a^n mod を計算する
long long modpow(long long a, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}
// グラフ用
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
// ここから書き始める

ll combination(ll n, ll i) {
  ll count = 0;
  ll multi = 1;
  ll div = 1;
  int limit = i;
  while (count < limit) {
    multi *= n;
    n--;
    multi /= count + 1;
    count++;
  }
  return multi / div;
}

int main() {
  cout << setprecision(10);
  ll h, w, k;
  cin >> h >> w >> k;
  vector<string> field(h);
  rep(i, h) { cin >> field[i]; }
  vector<vector<ll>> ans(h, vector<ll>(w));

  // 入力ok.それぞれのfieldは、次の#が出てくる手前までの区画でやればいい
  // イチゴがない場所を覚えておく
  vector<bool> ichigo(h, false);

  ll firstLine = -1;
  rep(i, h) {
    rep(j, w) {
      if (field[i][j] == '#') {
        if (firstLine == -1) {
          firstLine = i; // イチゴが最初に出てきたのは何行目か。
          ichigo[i] = true;
        } else {
          ichigo[i] = true;
          break;
        }
      }
    }
  }

  ll count = 0;
  for (int i = firstLine; i < h; i++) { // イチゴが出てきたラインから作
    bool onetime = false; // 行ごとに2回目出てくるまでは前の行＋1
    // 行が変わったとき、その行にイチゴがあるんだったら＋1
    if (ichigo[i])
      count++;
    rep(j, w) {
      if (ichigo[i] == false) { // イチゴがないんだったら、上のものをそのまま使う
        ans[i][j] = ans[i - 1][j];
      } else {
        if (field[i][j] == '#' && onetime) {
          count++;
          ans[i][j] = count;
        } else if (field[i][j] == '#') {
          ans[i][j] = count;
          onetime = true;
        } else {
          ans[i][j] = count;
        }
      }
    }
    // 行が変わるごとに、その行にイチゴがあるんだったらカウントを++する
  }

  // firstline より前を構築していく
  for (int i = firstLine - 1; i >= 0; i--) {
    rep(j, w) { ans[i][j] = ans[i + 1][j]; }
  }
  rep(i, h) {
    rep(j, w) { cout << ans[i][j] << " "; }
    cout << endl;
  }
  // 一行目日以後がなければ、全部j
}