TakahiroNakamori

TakahiroNakamori

中森崇博(ナカモリタカヒロ)

11 /
28
2021
 

Longest X

問題

D – Longest X
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…

記録

ポイント

  1. しゃくとり法で最大値を探す。
  2. 前処理として.の数を累積和を利用して計算する。

コード例

#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll = long long;
using P = pair<int, int>;
#define rep(i, n) for(int i = 0; i < (n); ++i)
// using mint = modint998244353;
// using mint = modint1000000007;
// const int mod = 1000000007;
// const ll INF = 1LL << 60;
// const int INF = 1001001001;

int main() {
  string S;
  int K;
  cin >> S >> K;

  int n = S.size();

  // 前処理:累積和
  vector<ll> sum(n + 1);
  rep(i, n) {
    if(S[i] == '.') {
      sum[i + 1] = sum[i] + 1;
    } else {
      sum[i + 1] = sum[i];
    }
  }

  // しゃくとり法で最大値を探す
  int ans = 0;
  int end = 0;

  rep(start, n) {
    while(end <= n - 1 && sum[end + 1] - sum[start] <= K) {
      end += 1;
    }
    ans = max(ans, end - start);
  }

  cout << ans << endl;
  return 0;
}