【形式化解释】
第一行输入整数
——测试用例组数。
每个测试用例:
一行三个整数
;
一行
个整数
;
一行
个整数
。
输入保证所有测试用例的之和、
之和均不超过
。
对每个测试用例输出一行整数,表示满足条件的子段数量。
1 4 1 1 4 1 5 6 6
1
#include <iostream> #include <unordered_map> #include <vector> using namespace std; int main() { int t; cin >> t; vector<int> res(t); for (int i = 0; i < t; ++i) { int n, m, k; cin >> n >> m >> k; vector<int> a; vector<int> b; unordered_map<int , int> ma; unordered_map<int, int> mb; for (int i = 0; i < n; ++i) { int x; cin >> x; a.push_back(x); } for (int i = 0; i < m; ++i) { int x; cin >> x; b.push_back(x); mb[x]++; } int cnt = 0; // init for (int i = 0; i < m; ++i) { ma[a[i]]++; } int match_cnt = 0; for (auto& [x, count] : mb) { if (ma.find(x) != ma.end()) { match_cnt += min(count, ma[x]); } } if (match_cnt >= k) cnt++; for (int i = m; i < n; ++i) { int left_val = a[i - m]; if (mb.find(left_val) != mb.end() && ma[left_val] <= mb[left_val]) { match_cnt--; } ma[left_val]--; if (ma[left_val] == 0) ma.erase(left_val); int right_val = a[i]; ma[right_val]++; if (mb.find(right_val) != mb.end() && ma[right_val] <= mb[right_val]) { match_cnt++; } if (match_cnt >= k) cnt++; } res[i] = cnt; } for (int i = 0; i < t; ++i) { cout << res[i] << endl; } return 0; } // 64 位输出请用 printf("%lld")