Problem p02733 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;
typedef long long int ll;

int h, w, kk;
char fi[15][1010];

int cnt[15][1010];

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> h >> w >> kk;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> fi[i][j];
      if (fi[i][j] == '1') {
        cnt[i + 1][j + 1] = cnt[i + 1][j] + 1;
      } else {
        cnt[i + 1][j + 1] = cnt[i + 1][j];
      }
    }
  }
  for (int i = 1; i <= h; i++) {
    for (int j = 1; j <= w; j++) {
      cnt[i][j] += cnt[i - 1][j];
    }
  }
  int ans = 1e9;
  for (int i = 0; i < (1 << (h - 1)); i++) {
    int res = __builtin_popcount(i);
    int p = 1;
    for (int k = 1; k <= w; k++) {
      int l = 1;
      for (int j = 0; j < h - 1; j++) {
        if ((1 << j) & i) {
          if (cnt[j + 1][k] + cnt[l - 1][k - 1] - cnt[j + 1][k - 1] -
                  cnt[l - 1][k] >
              kk) {
            res = 1e8;
            break;
          }
          if (cnt[j + 1][k] + cnt[l - 1][p - 1] - cnt[j + 1][p - 1] -
                  cnt[l - 1][k] >
              kk) {
            if (p != k)
              res++;
            p = k;
          }
          l = i + 1;
        }
      }
      if (cnt[h][k] + cnt[l - 1][k - 1] - cnt[h][k - 1] - cnt[l - 1][k] > kk) {
        res = 1e8;
        break;
      }
      if (cnt[h][k] + cnt[l - 1][p - 1] - cnt[h][p - 1] - cnt[l - 1][k] > kk) {
        if (p != k)
          res++;
        p = k;
      }
    }
    /*for(int j=0;j<h-1;j++){
        if((1<<j)&i){
            for(int k=1;k<=w;k++){
                if(cnt[j+1][k]+cnt[l-1][p-1]-cnt[j+1][p-1]-cnt[l-1][k]>kk){
                    res++;
                    if(p==k){
                        res=1e8;
                        break;
                    }
                    p=k;
                    if(cnt[j+1][k]+cnt[l-1][p-1]-cnt[j+1][p-1]-cnt[l-1][k]>kk){
                        res=1e8;
                        break;
                    }
                }
            }
            l=j+2;
            p=1;
        }
    }
    for(int k=1;k<=w;k++){
        if(cnt[h][k]+cnt[l-1][p-1]-cnt[h][p-1]-cnt[l-1][k]>kk){
            res++;
            if(p==k){
                res=1e8;
                break;
            }
            p=k-1;
        }
    }*/
    ans = min(ans, res);
  }
  cout << ans << endl;
}


Fixed submission:
#include <algorithm>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;
typedef long long int ll;

int h, w, kk;
char fi[15][1010];

int cnt[15][1010];

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> h >> w >> kk;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> fi[i][j];
      if (fi[i][j] == '1') {
        cnt[i + 1][j + 1] = cnt[i + 1][j] + 1;
      } else {
        cnt[i + 1][j + 1] = cnt[i + 1][j];
      }
    }
  }
  for (int i = 1; i <= h; i++) {
    for (int j = 1; j <= w; j++) {
      cnt[i][j] += cnt[i - 1][j];
    }
  }
  int ans = 1e9;
  for (int i = 0; i < (1 << (h - 1)); i++) {
    int res = __builtin_popcount(i);
    int p = 1;
    for (int k = 1; k <= w; k++) {
      int l = 1;
      for (int j = 0; j < h - 1; j++) {
        if ((1 << j) & i) {
          if (cnt[j + 1][k] + cnt[l - 1][k - 1] - cnt[j + 1][k - 1] -
                  cnt[l - 1][k] >
              kk) {
            res = 1e8;
            break;
          }
          if (cnt[j + 1][k] + cnt[l - 1][p - 1] - cnt[j + 1][p - 1] -
                  cnt[l - 1][k] >
              kk) {
            if (p != k)
              res++;
            p = k;
          }
          l = j + 2;
        }
      }
      if (cnt[h][k] + cnt[l - 1][k - 1] - cnt[h][k - 1] - cnt[l - 1][k] > kk) {
        res = 1e8;
        break;
      }
      if (cnt[h][k] + cnt[l - 1][p - 1] - cnt[h][p - 1] - cnt[l - 1][k] > kk) {
        if (p != k)
          res++;
        p = k;
      }
    }
    /*for(int j=0;j<h-1;j++){
        if((1<<j)&i){
            for(int k=1;k<=w;k++){
                if(cnt[j+1][k]+cnt[l-1][p-1]-cnt[j+1][p-1]-cnt[l-1][k]>kk){
                    res++;
                    if(p==k){
                        res=1e8;
                        break;
                    }
                    p=k;
                    if(cnt[j+1][k]+cnt[l-1][p-1]-cnt[j+1][p-1]-cnt[l-1][k]>kk){
                        res=1e8;
                        break;
                    }
                }
            }
            l=j+2;
            p=1;
        }
    }
    for(int k=1;k<=w;k++){
        if(cnt[h][k]+cnt[l-1][p-1]-cnt[h][p-1]-cnt[l-1][k]>kk){
            res++;
            if(p==k){
                res=1e8;
                break;
            }
            p=k-1;
        }
    }*/
    ans = min(ans, res);
  }
  cout << ans << endl;
}