恰好不定长滑动窗口

小红的01子序列构造(easy)

https://www.nowcoder.com/practice/ee0b6c6baa2642c182df8b4390126f9a

思路:题目问的是在一个连续的区间[l, r]中恰好存在k个"01"子序列,这其实是一个恰好不定长滑动窗口问题。一般来说,如果要计算满足条件的连续区间个数,我们需要用两次不定长滑窗解决,也就是用<= k - <= k - 1 = k,即用两个至多逻辑得到恰好逻辑(用至少逻辑也行)

不过本题只需要求出这样一个区间就行,并没有要求计算其个数,那么就只需要一次<= k滑窗,然后判断结果是否为k,如果有的话就输出结果即可;否则继续滑窗,最终没有恰好等于k的连续区间的话,输出-1

代码:

import sys
input = lambda: sys.stdin.readline().strip()

import math
inf = 10 ** 18

def I():
    return input()

def II():
    return int(input())

def MII():
    return map(int, input().split())

def GMI():
    return map(lambda x: int(x) - 1, input().split())

def LI():
    return input().split()

def LII():
    return list(map(int, input().split()))

def LFI():
    return list(map(float, input().split()))

fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))

'''

'''

def solve():
    n, k = MII()
    s = I()

    l = 0
    zeros = 0
    ones = 0
    current = 0

    for r in range(n):
        if s[r] == '0':
            zeros += 1
        else:
            current += zeros
            ones += 1

        while current > k:
            if s[l] == '0':
                zeros -= 1
                current -= ones
            else:
                ones -= 1
            l += 1

        if current == k:
            print(l + 1, r + 1)
            return

    print(-1)

t = 1
# t = II()
for _ in range(t):
    solve()
#每日一题挑战#
全部评论

相关推荐

2025-12-18 11:59
广州南方学院 C++
牛客78682892...:直接点还好,总比要了简历也不回的强
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务