#include<bits/stdc++.h>
using namespace std;
void solve() {
int n, k, t; cin >> n >> k >> t;
string s; cin >> s;
int work = 0;
int ans = INT_MIN;
while (work + 2 * t <= n) {
int len = work;
if (work > 0) len += 2 * t;
int types_in[4] = {0};
int types_out[4] = {0};
int types_travel[4] = {0};
int l = 0, r = len - 1;
for (int i = 0; i < n; i++) {
if (work > 0) {
if (i < t) {
types_travel[s[i] - '0']++;
} else if (i >= t && i < t + work) {
types_in[s[i] - '0']++;
} else if (i >= t + work && i < work + 2 * t) {
types_travel[s[i] - '0']++;
} else {
types_out[s[i] - '0']++;
}
} else {
types_out[s[i] - '0']++;
}
}
while (r < n) {
// Check if condition met.
int avoided = types_travel[1] + types_travel[2] + types_out[1];
if (avoided <= k) {
int available = k - avoided;
ans = max(ans, types_out[3] + types_out[1] + min(available, types_out[2]));
}
// Transition.
types_travel[s[l] - '0']--;
types_out[s[l] - '0']++;
types_in[s[l + t] - '0']--;
types_travel[s[l + t] - '0']++;
l++;
r++;
if (r < n) {
types_travel[s[r] - '0']++;
types_out[s[r] - '0']--;
types_in[s[r - t] - '0']++;
types_travel[s[r - t] - '0']--;
}
if(work == 0) break;
}
work++;
}
cout << (ans == INT_MIN ? -1 : ans) << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
solve();
}
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 | #include<bits/stdc++.h> using namespace std; void solve() { int n, k, t; cin >> n >> k >> t; string s; cin >> s; int work = 0; int ans = INT_MIN; while (work + 2 * t <= n) { int len = work; if (work > 0) len += 2 * t; int types_in[4] = {0}; int types_out[4] = {0}; int types_travel[4] = {0}; int l = 0, r = len - 1; for (int i = 0; i < n; i++) { if (work > 0) { if (i < t) { types_travel[s[i] - '0']++; } else if (i >= t && i < t + work) { types_in[s[i] - '0']++; } else if (i >= t + work && i < work + 2 * t) { types_travel[s[i] - '0']++; } else { types_out[s[i] - '0']++; } } else { types_out[s[i] - '0']++; } } while (r < n) { // Check if condition met. int avoided = types_travel[1] + types_travel[2] + types_out[1]; if (avoided <= k) { int available = k - avoided; ans = max(ans, types_out[3] + types_out[1] + min(available, types_out[2])); } // Transition. types_travel[s[l] - '0']--; types_out[s[l] - '0']++; types_in[s[l + t] - '0']--; types_travel[s[l + t] - '0']++; l++; r++; if (r < n) { types_travel[s[r] - '0']++; types_out[s[r] - '0']--; types_in[s[r - t] - '0']++; types_travel[s[r - t] - '0']--; } if(work == 0) break; } work++; } cout << (ans == INT_MIN ? -1 : ans) << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); solve(); } |
English