#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
inline int rangeSum(const vector<int>& pref, int l, int r) {
if(l > r) return 0;
return pref[r] - pref[l-1];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k, t;
cin >> n >> k >> t;
string s;
cin >> s;
s = " " + s;
vector<int> p1(n+1, 0), p2(n+1, 0), p3(n+1, 0), pMeet(n+1, 0);
for (int i = 1; i <= n; i++){
p1[i] = p1[i-1] + (s[i]=='1');
p2[i] = p2[i-1] + (s[i]=='2');
p3[i] = p3[i-1] + (s[i]=='3');
pMeet[i] = pMeet[i-1] + ((s[i]=='1' || s[i]=='2') ? 1 : 0);
}
int total1 = rangeSum(p1, 1, n);
int total2 = rangeSum(p2, 1, n);
int total3 = rangeSum(p3, 1, n);
long long best = -1;
if(total1 <= k) {
long long tasksNoTrip = total3 + total1 + min(total2, k - total1);
best = max(best, tasksNoTrip);
}
for (int a = 1; a <= n - t + 1; a++){
int transitFrom = rangeSum(pMeet, a, a+t-1);
for (int b = a + t; b <= n - t; b++){
int transitBack = rangeSum(pMeet, b+1, b+t);
int transitPenalty = transitFrom + transitBack;
if(transitPenalty > k) continue;
int home_left_1 = rangeSum(p1, 1, a-1);
int home_left_2 = rangeSum(p2, 1, a-1);
int home_left_3 = rangeSum(p3, 1, a-1);
int home_right_1 = rangeSum(p1, b+t+1, n);
int home_right_2 = rangeSum(p2, b+t+1, n);
int home_right_3 = rangeSum(p3, b+t+1, n);
int home1 = home_left_1 + home_right_1;
int home2 = home_left_2 + home_right_2;
int home3 = home_left_3 + home_right_3;
int r = k - transitPenalty;
if(home1 > r) continue;
long long tasksHome = (long long)home3 + home1 +
min(home2, r - home1);
best = max(best, tasksHome);
}
}
cout << best << "\n";
return 0;
}
//6 5 1
//231323
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 | #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; inline int rangeSum(const vector<int>& pref, int l, int r) { if(l > r) return 0; return pref[r] - pref[l-1]; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, k, t; cin >> n >> k >> t; string s; cin >> s; s = " " + s; vector<int> p1(n+1, 0), p2(n+1, 0), p3(n+1, 0), pMeet(n+1, 0); for (int i = 1; i <= n; i++){ p1[i] = p1[i-1] + (s[i]=='1'); p2[i] = p2[i-1] + (s[i]=='2'); p3[i] = p3[i-1] + (s[i]=='3'); pMeet[i] = pMeet[i-1] + ((s[i]=='1' || s[i]=='2') ? 1 : 0); } int total1 = rangeSum(p1, 1, n); int total2 = rangeSum(p2, 1, n); int total3 = rangeSum(p3, 1, n); long long best = -1; if(total1 <= k) { long long tasksNoTrip = total3 + total1 + min(total2, k - total1); best = max(best, tasksNoTrip); } for (int a = 1; a <= n - t + 1; a++){ int transitFrom = rangeSum(pMeet, a, a+t-1); for (int b = a + t; b <= n - t; b++){ int transitBack = rangeSum(pMeet, b+1, b+t); int transitPenalty = transitFrom + transitBack; if(transitPenalty > k) continue; int home_left_1 = rangeSum(p1, 1, a-1); int home_left_2 = rangeSum(p2, 1, a-1); int home_left_3 = rangeSum(p3, 1, a-1); int home_right_1 = rangeSum(p1, b+t+1, n); int home_right_2 = rangeSum(p2, b+t+1, n); int home_right_3 = rangeSum(p3, b+t+1, n); int home1 = home_left_1 + home_right_1; int home2 = home_left_2 + home_right_2; int home3 = home_left_3 + home_right_3; int r = k - transitPenalty; if(home1 > r) continue; long long tasksHome = (long long)home3 + home1 + min(home2, r - home1); best = max(best, tasksHome); } } cout << best << "\n"; return 0; } //6 5 1 //231323 |
English