【形式化解释】
第一行输入整数
——测试用例组数。
每个测试用例:
一行三个整数
;
一行
个整数
;
一行
个整数
。
输入保证所有测试用例的之和、
之和均不超过
。
对每个测试用例输出一行整数,表示满足条件的子段数量。
1 4 1 1 4 1 5 6 6
1
import sys from collections import Counter # 在 a 里滑动一个长度为 m 的窗口, # 每次问:这个窗口里的数字, # 和 b 最多能对上几个? # 如果 ≥ k,就算一个好窗口。最终输出好窗口的数量。天天把题目写那么绕干蛤啊,嗯→膜⬆! # 滑动窗口可以简单的理解成,右边进来一个数,然后左边出去一个 t = int(input()) for _ in range(t): n, m, k = map(int, input().split()) a = list(map(int, input().split())) b = list(map(int, input().split())) need = Counter(b) window = Counter() match = 0 # 连续字段中数字匹配的次数 ans = 0 # 双指针 left = 0 for right in range(n): x = a[right] window[x] += 1 if window[x] <= need[x]: match += 1 # 保持窗口长度为 m。出去一个,自然匹配次数要-1 if right - left + 1 > m: y = a[left] if window[y] <= need[y]: match -= 1 window[y] -= 1 left += 1 if right - left + 1 == m and match >= k: ans += 1 print(ans)