Problem p02721 (C++)

Buggy submission (status: Runtime Error):
// AtCoder.cpp : このファイルには 'main'
// 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

// AtCoder.cpp : このファイルには 'main'
// 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

#define _USE_MATH_DEFINES
#include <math.h>

// #include<cmath>

#include <algorithm>
#include <array>
#include <assert.h>
#include <bitset>
#include <chrono>
#include <cmath>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <map>
#include <memory>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_set>
#include <vector>

// #include "Ants.h"
using namespace std;
typedef long long ll;
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)
#define EPS (1e-7)
#define INF (1e9)
#define PI (acos(-1))
#define rep(i, n) for (int i = 0; i < n; i++)
#define show(s) cout << s << endl
#define chmin(x, y) x = min(x, y)
#define chmax(x, y) x = max(x, y)
#define LINF (1000000000000000000ll)
// typedef pair < int, int> P;
ll gcd(ll a, ll b) { // 最大公約数を求める///最大公倍数a*b/gcd(a,b)
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
ll lcd(ll a, ll b) { // 最小公倍数を求める　b=0のときaを返す
  if (b == 0)
    return a;
  return (a / gcd(a, b)) * b;
}
vector<int> divnum(ll num) {
  int dig;
  vector<int> p;
  while (num) {
    dig = num % 10;
    p.push_back(dig);
    num /= 10;
  }
  return p;
}
int digiter(ll num) {
  int dig;
  vector<int> p;
  while (num) {
    dig = num % 10;
    p.push_back(dig);
    num /= 10;
  }
  return p.size();
}
vector<int> convertstring(string s) {
  vector<int> d;
  ll n = s.size();
  rep(i, n) { d.push_back(s[i] - '0'); }
  return d;
}
map<int64_t, int> prime_factor(int64_t n) {
  map<int64_t, int> ret;
  for (int64_t i = 2; i * i <= n; i++) {
    while (n % i == 0) {
      ret[i]++;
      n /= i;
    }
  }
  if (n != 1)
    ret[n] = 1;
  return ret;
}
vector<ll> divisor(ll n) {
  vector<ll> res;
  for (ll i = 1; i * i <= n; i++) {
    if (n % i != 0)
      continue;
    res.push_back(i);
    if (i * i != n)
      res.push_back(n / i);
  }
  return res;
}

int N, K, C;
int F[100000], B[100000];
int szf[10000], szb[100000];
string S;
int main() {
  cin >> N >> K >> C;
  cin >> S;
  F[1] = 1;
  int res = 1;
  for (int i = 1; i < N + 1; i++) {
    F[i] = F[res];

    if (i - res > C && S[i - 1] == 'o') {
      F[i] = F[res] + 1;
      res = i;
    }
    szf[i] = res;
  }
  res = N;
  B[res] = 1;
  for (int i = N; i > 0; --i) {
    B[i] = B[res];
    if (res - i > C && S[i - 1] == 'o') {
      B[i] = B[res] + 1;
      res = i;
    }
    szb[i] = res;
  }
  szf[0] = -INF;
  szb[N + 1] = INF;
  int ans = 0;
  for (int i = 1; i < N + 1; i++) {
    int sum = F[i - 1] + B[i + 1];
    if (abs(szf[i - 1] - szb[i + 1]) <= C) {
      sum--;
    }
    // cout << i<<" "<<sum << endl;
    if (sum < K && S[i - 1] == 'o') {
      cout << i << endl;
    }
  }
}

Fixed submission:
// AtCoder.cpp : このファイルには 'main'
// 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

// AtCoder.cpp : このファイルには 'main'
// 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

#define _USE_MATH_DEFINES
#include <math.h>

// #include<cmath>

#include <algorithm>
#include <array>
#include <assert.h>
#include <bitset>
#include <chrono>
#include <cmath>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <map>
#include <memory>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_set>
#include <vector>

// #include "Ants.h"
using namespace std;
typedef long long ll;
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)
#define EPS (1e-7)
#define INF (1e9)
#define PI (acos(-1))
#define rep(i, n) for (int i = 0; i < n; i++)
#define show(s) cout << s << endl
#define chmin(x, y) x = min(x, y)
#define chmax(x, y) x = max(x, y)
#define LINF (1000000000000000000ll)
// typedef pair < int, int> P;
ll gcd(ll a, ll b) { // 最大公約数を求める///最大公倍数a*b/gcd(a,b)
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
ll lcd(ll a, ll b) { // 最小公倍数を求める　b=0のときaを返す
  if (b == 0)
    return a;
  return (a / gcd(a, b)) * b;
}
vector<int> divnum(ll num) {
  int dig;
  vector<int> p;
  while (num) {
    dig = num % 10;
    p.push_back(dig);
    num /= 10;
  }
  return p;
}
int digiter(ll num) {
  int dig;
  vector<int> p;
  while (num) {
    dig = num % 10;
    p.push_back(dig);
    num /= 10;
  }
  return p.size();
}
vector<int> convertstring(string s) {
  vector<int> d;
  ll n = s.size();
  rep(i, n) { d.push_back(s[i] - '0'); }
  return d;
}
map<int64_t, int> prime_factor(int64_t n) {
  map<int64_t, int> ret;
  for (int64_t i = 2; i * i <= n; i++) {
    while (n % i == 0) {
      ret[i]++;
      n /= i;
    }
  }
  if (n != 1)
    ret[n] = 1;
  return ret;
}
vector<ll> divisor(ll n) {
  vector<ll> res;
  for (ll i = 1; i * i <= n; i++) {
    if (n % i != 0)
      continue;
    res.push_back(i);
    if (i * i != n)
      res.push_back(n / i);
  }
  return res;
}

int N, K, C;
int F[200100], B[200100];
int szf[200100], szb[200100];
string S;
int main() {
  cin >> N >> K >> C;
  cin >> S;
  F[1] = 1;
  int res = 1;
  for (int i = 1; i < N + 1; i++) {
    F[i] = F[res];

    if (i - res > C && S[i - 1] == 'o') {
      F[i] = F[res] + 1;
      res = i;
    }
    szf[i] = res;
  }
  res = N;
  B[res] = 1;
  for (int i = N; i > 0; --i) {
    B[i] = B[res];
    if (res - i > C && S[i - 1] == 'o') {
      B[i] = B[res] + 1;
      res = i;
    }
    szb[i] = res;
  }
  szf[0] = -INF;
  szb[N + 1] = INF;
  int ans = 0;
  for (int i = 1; i < N + 1; i++) {
    int sum = F[i - 1] + B[i + 1];
    if (abs(szf[i - 1] - szb[i + 1]) <= C) {
      sum--;
    }
    // cout << i<<" "<<sum << endl;
    if (sum < K && S[i - 1] == 'o') {
      cout << i << endl;
    }
  }
}