AP. 完善程序题-0000
完善程序题-0000
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述:最短覆盖子串
给定一个长度为 n (1 ≤ n ≤ 10^5) 的整数序列 a[],序列中所有元素的值在 1 到 m 之间(m ≤ n)。 再给定一个长度为 k (1 ≤ k ≤ m) 的“目标集合” b[],b 中元素互不相同。
要求:找到一个最短的连续子段,使得该子段包含 b 中的所有元素至少一次。 如果不存在,输出 0。
输入:
第一行 n m k
第二行 n 个整数,表示 a[]
第三行 k 个整数,表示 b[]
输出:
最短子段长度
示例:
输入:
10 5 3
1 3 2 5 4 3 2 1 5 3
2 3 5
输出:
3
#include <iostream>
using namespace std;
const int MAXN = 100005;
int a[MAXN];
bool need[MAXN];
int cnt[MAXN];
int main() {
int n, m, k;
cin >> n >> m >> k;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i <= m; i++) {
need[i] = false;
}
for (int i = 0; i < k; i++) {
int x;
cin >> x;
need[x] = true;
}
int left = 0;
int satisfied = 0;
int min_len = n + 1;
for (int right = 0; right < n; right++) {
if (need[a[right]]) {
cnt[a[right]]++;
if (_____(1)_____) {
satisfied++;
}
}
while (_____(2)_____ && left <= right) {
int cur_len = _____(3)_____;
if (cur_len < min_len) {
min_len = cur_len;
}
if (need[a[left]]) {
cnt[a[left]]--;
if (cnt[a[left]] == 0) {
_____(4)_____;
}
}
_____(5)_____;
}
}
if (min_len == n + 1) {
cout << 0 << endl;
} else {
cout << min_len << endl;
}
return 0;
}
- 程序第 (1) 处应填入? {{ select(1) }}
cnt[a[right]] == 1cnt[a[right]] > 0cnt[a[right]] == 0a[right] == need[a[right]]
- 程序第 (2) 处应填入? {{ select(2) }}
satisfied < ksatisfied == kleft < rightcnt[a[left]] > 0
- 程序第 (3) 处应填入? {{ select(3) }}
right - leftright - left + 1right - left - 1left - right + 1
- 程序第 (4) 处应填入? {{ select(4) }}
satisfied++satisfied--satisfied = 0satisfied = cnt[a[left]]
- 程序第 (5) 处应填入? {{ select(5) }}
right++left++left--satisfied++
答案:ABBBB