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';
}