D. Inaccurate Subsequence Search

https://codeforces.com/problemset/problem/1955/D

题意:给定数组a和b,问a中有多少连续长度跟b相同的连续区间,包含与b至少相同的k个字符。

思路:滑动窗口,维护一个变量same表示当前相同的字符,每次去除字符看要去除的字符是否对same有贡献,只要这个字符出现的次数<=b中该字符出现的次数,则有贡献;添加新字符同理,就看新的字符出现的次数是否<=b中该字符出现的次数即可。

inline void solve() {
	int n, m, k;
	cin >> n >> m >> k;

	vector<int> a(n);
	for (auto& x : a) {
		cin >> x;
	}
	map<int, int> b;
	for (int i = 0; i < m; ++i) {
		int t;
		cin >> t;
		b[t] ++;
	}

	map<int, int> c;
	for (int i = 0; i < m; ++i) {
		c[a[i]] ++;
	}
	int same = 0;
	for (auto [x, y] : c) {
		if (b[x] > 0) {
			same += min(y, b[x]);
		}
	}
	int ans = 0;
	if (same >= k) {
		ans ++;
	}
	for (int i = m; i < n; ++i) {
		int x = a[i - m];
		int cx = c[x];
		int bx = b[x];
		if (bx >= cx) {
			same --;
		}
		c[x] --;
		x = a[i];
		if (b[x] > c[x]) {
			same ++;
		}
		c[x] ++;
		ans += same >= k;
	}

	cout << ans << '\n';
}
posted @ 2025-04-18 09:31  _Yxc  阅读(7)  评论(0)    收藏  举报