恰好不定长滑动窗口
小红的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()
#每日一题挑战#