解法参考评论区大佬,虽然用例全能pass,但有个小疑问,l++使num减少,r++使num增大,这样一来一回的过程会不会让num错过k值?

#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;

int main() {
    ll n, k;
    cin >> n >> k;
    string s;
    cin >> s;
    ll l = 0, r = 0; //滑动窗口的左右边界
    ll zero = 0, one = 0; //用来记录区间里面0和1的数量
    ll num = 0; //01子序列的个数

    (s[0] == '0') ? ++zero: ++one; //初始化

    while(l < n && r < n) {
        if(num == k) {
            cout << l+1 << " " << r+1 << endl;
            return 0;
        } else if(num < k) { //01对太少了则将窗口右边界增大
            ++r;
            if(s[r] == '0') ++zero;
            else { //为'1'
                num += zero;
                ++one;
            }
        } else { //太多了则将窗口左边界增大
            if(s[l] == '1') --one;
            else {
                num -= one;
                --zero;
            }
            ++l;
        }
    }
    cout << -1 << endl;
    return 0;
}