#include<iostream> #include<string> #include<vector> #include<math.h> using namespace std; int main() { int n; int k; int t; cin >> n >> k >> t; string s; cin >> s; vector<vector<int> > total_before; for (int i = 0; i < 4; i++) { vector<int> tt = vector<int>(s.size(), 0); total_before.push_back(tt); } int zero = int('0'); total_before[int(s[0]) - zero][0] = 1; for (int i = 1; i < n; i++) { for (int j = 1; j <= 3; j++) { if (int(s[i]) - zero == j) { total_before[j][i] = total_before[j][i-1] + 1; } else { total_before[j][i] = total_before[j][i-1]; } } } vector<int> totals(4); for (int j = 1; j <= 3; j++) { totals[j] = total_before[j][s.size() - 1]; } if (totals[1] <= k) { cout << min(n, totals[3] + k); return 0; } vector<int> missed_until_arrived(n, k+1); vector<int> missed_from_left(n, k+1); vector<int> min_available_before_arrived(n, 0); vector<int> min_available_from_left(n, 0); for (int i = t; i < n - t; i++) { missed_until_arrived[i] = total_before[1][i] + total_before[2][i] - total_before[2][i-t]; missed_from_left[i] = totals[1] - total_before[1][i-1] + total_before[2][i+t-1] - total_before[2][i-1]; min_available_before_arrived[i] = total_before[3][i-t] + total_before[1][i-t]; min_available_from_left[i] = totals[3] - total_before[3][i+t-1] + totals[1] - total_before[1][i+t-1]; } missed_until_arrived[t-1] = total_before[1][t-1] + total_before[2][t-1]; missed_from_left[s.size() - t] = totals[1] - total_before[2][s.size() - t - 1] + totals[2] - total_before[2][s.size() - t - 1]; int max_time = 0; bool is_possible = false; int missed_meetings = k + 1; int min_solve_time = 0; int max_solve_time1 = 0; int max_solve_time2 = 0; int solve_time = 0; for (int i = t - 1; i < n - t; i++) { for (int j = i + 1; j <= n - t; j++) { missed_meetings = missed_until_arrived[i] + missed_from_left[j]; if (missed_meetings <= k) { is_possible = true; min_solve_time = min_available_before_arrived[i] + min_available_from_left[j]; max_solve_time1 = min_solve_time + (k - missed_meetings); max_solve_time2 = (i - t + 2) + (s.size() - j - t); solve_time = min(max_solve_time1, max_solve_time2); if (solve_time > max_time) { max_time = solve_time; } } } } if (!is_possible) { cout << -1; } else { cout << max_time; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include<iostream> #include<string> #include<vector> #include<math.h> using namespace std; int main() { int n; int k; int t; cin >> n >> k >> t; string s; cin >> s; vector<vector<int> > total_before; for (int i = 0; i < 4; i++) { vector<int> tt = vector<int>(s.size(), 0); total_before.push_back(tt); } int zero = int('0'); total_before[int(s[0]) - zero][0] = 1; for (int i = 1; i < n; i++) { for (int j = 1; j <= 3; j++) { if (int(s[i]) - zero == j) { total_before[j][i] = total_before[j][i-1] + 1; } else { total_before[j][i] = total_before[j][i-1]; } } } vector<int> totals(4); for (int j = 1; j <= 3; j++) { totals[j] = total_before[j][s.size() - 1]; } if (totals[1] <= k) { cout << min(n, totals[3] + k); return 0; } vector<int> missed_until_arrived(n, k+1); vector<int> missed_from_left(n, k+1); vector<int> min_available_before_arrived(n, 0); vector<int> min_available_from_left(n, 0); for (int i = t; i < n - t; i++) { missed_until_arrived[i] = total_before[1][i] + total_before[2][i] - total_before[2][i-t]; missed_from_left[i] = totals[1] - total_before[1][i-1] + total_before[2][i+t-1] - total_before[2][i-1]; min_available_before_arrived[i] = total_before[3][i-t] + total_before[1][i-t]; min_available_from_left[i] = totals[3] - total_before[3][i+t-1] + totals[1] - total_before[1][i+t-1]; } missed_until_arrived[t-1] = total_before[1][t-1] + total_before[2][t-1]; missed_from_left[s.size() - t] = totals[1] - total_before[2][s.size() - t - 1] + totals[2] - total_before[2][s.size() - t - 1]; int max_time = 0; bool is_possible = false; int missed_meetings = k + 1; int min_solve_time = 0; int max_solve_time1 = 0; int max_solve_time2 = 0; int solve_time = 0; for (int i = t - 1; i < n - t; i++) { for (int j = i + 1; j <= n - t; j++) { missed_meetings = missed_until_arrived[i] + missed_from_left[j]; if (missed_meetings <= k) { is_possible = true; min_solve_time = min_available_before_arrived[i] + min_available_from_left[j]; max_solve_time1 = min_solve_time + (k - missed_meetings); max_solve_time2 = (i - t + 2) + (s.size() - j - t); solve_time = min(max_solve_time1, max_solve_time2); if (solve_time > max_time) { max_time = solve_time; } } } } if (!is_possible) { cout << -1; } else { cout << max_time; } } |