void solve() {
int n, m, k;
std::cin >> n >> m >> k;
std::vector<int> a(n), b(m);
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
for (int i = 0; i < m; i++) {
std::cin >> b[i];
}
std::map<int, int> cnt;
for (int i = 0; i < m; i++) {
cnt[b[i]]++;
}
int ans = 0;
int good = 0;
//前m个,
for (int i = 0; i < m - 1; i++) {
//前m个有多少个和b匹配
good += cnt[a[i]]-- > 0;
}
//滑动窗口,子段m有多少个与它匹配
for (int i = 0; i <= n - m; i++) {
//新进来一个是否匹配
good += cnt[a[i + m - 1]]-- > 0;
//加上它是否大于等于k
ans += (good >= k);
//减去头元素
good -= ++cnt[a[i]] > 0;
}
std::cout << ans << "\n";
}
//窗口大小m,首先匹配m-1个,然后将一个新element添加到窗口并进行匹配(什么是匹配?我们记录b[i]不同元素的个数存在map里),good += cnt[a[i]]-- > 0;>0说明当前还有可以与b[i]中元素匹配的,最后将队首元素还原回来.good>=k说明当前元素多于k,便加到ans里