Codeforces Round 938 D Inaccurate Subsequence Search

本文介绍了解决滑动窗口问题的一种方法,使用Python的deque数据结构和字典记录列表中元素在窗口内的出现次数,当某个元素出现次数达到k时计数器加一。
摘要由CSDN通过智能技术生成

一道自认为很典型的滑动窗口问题,整理思路重新写一篇文章来当作笔记

思路

用两个列表进行记录,当前滑动窗口中一个元素出现了几次(注意,不管是a列表还是b列表的元素都不是唯一的,所以要采用这个方法来记录)如果大于等于匹配度k就将计数器加上1

from collections import deque

t = int(input())
for _ in range(t):
    n, m, k = map(int, input().split())
    a = [0]
    b = [0]
    a.extend(list(map(int, input().split())))
    b.extend(list(map(int, input().split())))
    rec = {}
    mp = {}
    q = deque()
    for i in range(1, len(b)):
        try:
            rec[b[i]] += 1
        except KeyError:
            rec[b[i]] = 1
    for key in a:
        mp.update({key: 0})
        try:
            rec[key] += 0
        except KeyError:
            rec[key] = 0
    match = cnt = 0
    for i in range(1, m + 1):
        q.append(a[i])
        if mp[a[i]] < rec[a[i]]:
            if rec[a[i]] != 0:
                match += 1
        mp[a[i]] += 1
    if match >= k:
        cnt += 1
    for i in range(m + 1, n + 1):
        if mp[q[0]] <= rec[q[0]]:
            if rec[q[0]] != 0:
                match -= 1
        mp[q[0]] -= 1
        q.popleft()
        q.append(a[i])
        if mp[a[i]] < rec[a[i]]:
            if rec[a[i]] != 0:
                match += 1
        mp[a[i]] += 1
        if match >= k:
            cnt += 1
    print(cnt)

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值