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