Problem p02721 (C++) — buggy submission, verdict: Time Limit Exceeded

#define _USE_MATH_DEFINES
#pragma region include

#include <iomanip>
#include <iostream>
#include <stdio.h>

#include <algorithm>
#include <cmath>
#include <complex>
#include <iterator>
#include <sstream>

#include <bitset>
#include <cstring>
#include <string>
#include <vector>

#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>

#include <ctime>
////
// #include <random>//
#pragma endregion // #include
/////////

#pragma region typedef
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
#pragma endregion // typedef
////定数
const int INF = (int)1e9 + 10;
const LL MOD = (LL)1e9 + 7;
const LL LINF = (LL)4e18 + 20;
const LD PI = acos(-1.0);
const double EPS = 1e-9;
/////////
using namespace ::std;
//////////////
int N, K, C;
vector<bool> Bjob;
vector<bool> OK;
vector<bool> res; // 出勤日
int workDayMAX = 0;
/*
Bjob,追加条件
OK 働いてもいいひ
*/
bool cal() {
  // OKをベースに

  int cnt = 0; // 出勤日数
  for (int i = 0; i < N; ++i) {
    if (OK[i] == false) {
      // 働けない日
      continue;
    }
    res[i] = true;
    ++cnt; // 働いた日は全部チェックできる。
    // 次に調べるのはi+C+1の場所
    i = i + C;
  }

  workDayMAX = cnt;
  if (cnt >= K) {
    return true;
  }
  return false;
}
/*
問題の前提として
oが働いても良い日
xは絶対に働かない日
*/
void solve() {
  /*
  条件は両方満たす必要がある。
  C日の休息は絶対。
  i日後は後半考えられない。
  */

  string str;
  cin >> N >> K >> C >> str;

  OK = vector<bool>(N, true);
  for (int i = 0; i < N; ++i) {
    if (str[i] == 'x') {
      OK[i] = false;
    }
  }
  res = vector<bool>(N, false); // 働いた日がtrueで帰ってくる。
  vector<bool> res2(N, false);
  if (cal() == false) {
    cout << "";
  }
  res2 = res;
  res = vector<bool>(N, false); // 働いた日がtrueで帰ってくる。
  int WMD = workDayMAX;         // 保存

  reverse(OK.begin(), OK.end());
  if (cal() == false) { // 逆貪欲
    cout << "";
  }
  workDayMAX = WMD;

  vector<bool> res3(N, false);
  for (int i = 0; i < N; ++i) {
    if (res[i]) {
      res3[N - i - 1] = true;
    }
  }
  // res2,と逆でやったre3
  if (cal() == false) { // 貪欲失敗かな
    // 必ず一通りは働く日程表がある。
    cout << "";
  }
  if (workDayMAX > K) {
    // K日を超えて働けるなら何処か休んでもOK
    return;
  }
  vector<bool> base = res;
  int cnt = 0;

  for (int i = 0; i < N; ++i) {
    if (res2[i] == true && res3[i] == true) {
      cout << i + 1 << endl;
    }
  }
  return;

  for (int i = 0; i < N; ++i) {
    if (res[i] == false) {
      continue;
    }

    OK[i] = false; // 働けない日に設定。
    /*
    resを使ってOKを操作して
    働けたら休みにできる。
    */
    if (cal() == false) {
      if (cnt == 0) {
        ++cnt;
      }
      cout << i + 1 << endl;
      ;
    }

    OK[i] = true; // リセット
  }
}

#pragma region main
signed main(void) {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  std::cout << std::fixed; // 小数を10進数表示
  cout << setprecision(16); // 小数点以下の桁数を指定//coutとcerrで別

  solve();
}
#pragma endregion // main()


Error: TLE

Fixed submission:

#define _USE_MATH_DEFINES
#pragma region include

#include <iomanip>
#include <iostream>
#include <stdio.h>

#include <algorithm>
#include <cmath>
#include <complex>
#include <iterator>
#include <sstream>

#include <bitset>
#include <cstring>
#include <string>
#include <vector>

#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>

#include <ctime>
////
// #include <random>//
#pragma endregion // #include
/////////

#pragma region typedef
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
#pragma endregion // typedef
////定数
const int INF = (int)1e9 + 10;
const LL MOD = (LL)1e9 + 7;
const LL LINF = (LL)4e18 + 20;
const LD PI = acos(-1.0);
const double EPS = 1e-9;
/////////
using namespace ::std;
//////////////
int N, K, C;
vector<bool> Bjob;
vector<bool> OK;
vector<bool> res; // 出勤日
int workDayMAX = 0;
/*
Bjob,追加条件
OK 働いてもいいひ
*/
bool cal() {
  // OKをベースに

  int cnt = 0; // 出勤日数
  for (int i = 0; i < N; ++i) {
    if (cnt >= K)
      break;
    if (OK[i] == false) {
      // 働けない日
      continue;
    }
    res[i] = true;
    ++cnt; // 働いた日は全部チェックできる。
    // 次に調べるのはi+C+1の場所
    i = i + C;
  }

  workDayMAX = cnt;
  if (cnt >= K) {
    return true;
  }
  return false;
}
/*
問題の前提として
oが働いても良い日
xは絶対に働かない日
*/
void solve() {
  /*
  条件は両方満たす必要がある。
  C日の休息は絶対。
  i日後は後半考えられない。
  */

  string str;
  cin >> N >> K >> C >> str;

  OK = vector<bool>(N, true);
  for (int i = 0; i < N; ++i) {
    if (str[i] == 'x') {
      OK[i] = false;
    }
  }
  res = vector<bool>(N, false); // 働いた日がtrueで帰ってくる。
  if (cal() == false) {         // 貪欲失敗かな
    // 必ず一通りは働く日程表がある。
    cout << "";
  }
  if (workDayMAX > K) {
    // K日を超えて働けるなら何処か休んでもOK
    return;
  }
  vector<bool> base = res;
  int cnt = 0;
  for (int i = 0; i < N; ++i) {
    if (res[i] == false) {
      continue;
    }

    OK[i] = false; // 働けない日に設定。
    /*
    resを使ってOKを操作して
    働けたら休みにできる。
    */
    if (cal() == false) {
      if (cnt == 0) {
        ++cnt;
      }
      cout << i + 1 << endl;
      ;
    }

    OK[i] = true; // リセット
  }
}

#pragma region main
signed main(void) {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  std::cout << std::fixed; // 小数を10進数表示
  cout << setprecision(16); // 小数点以下の桁数を指定//coutとcerrで別

  solve();
}
#pragma endregion // main()