予鈴

アウトプットとメモ書きの中間みたいな記事がたくさん出ます。

D - Longest X

問題

atcoder.jp

解説

尺取法で解ける.いつもサボるのでちゃんと書いておこうともう.
半開区間(  [l,r) )で区間を管理しながら行う.
尺取法は,ある条件を満たす区間をできるだけ伸ばして,条件が合わなくなったら左の区間を縮めていく.
更新のタイミングが(個人的に)厄介.
 rは開区間なので,条件より常に+1個多めに見ておけば良い. (つまり, ansの更新の前に tmp > Kになりうる).
次に, lは閉区間なので,更新する直前に,今見ている添字の情報を更新してあげれば良い.


#include <bits/stdc++.h>

using namespace std;
using Int = long long;

int main(){
    string S; cin >> S;
    Int K; cin >> K;
    
    Int ans = 0, l = 0, r = 0;
    Int tmp  = (S[l] == '.');
    Int N = S.size();
    
    // [l,r)
    while(l < N){
        
        while(r < N && tmp <= K){
            ++r;
            if(r == N )break;
            tmp += (S[r] == '.');
        }

        ans = max(ans, r - l);
        
        tmp -= ( S[l] == '.');
        ++l;
    }
    
    cout << ans << endl;
    
}