#include <array>
#include <iostream>
#include <vector>
int main() {
std::ios_base::sync_with_stdio(false);
int n, k, t;
std::cin >> n >> k >> t;
char a;
std::vector<int> mainVec;
mainVec.assign(n, 0);
std::array<std::vector<int>, 4> pref, suf;
pref.fill(mainVec);
suf.fill(mainVec);
int x;
std::cin >> a;
x = a - '0';
mainVec[0] = x;
pref[x][0]++;
for (int i = 1; i < n; i++) {
std::cin >> a;
pref[1][i] = pref[1][i - 1];
pref[2][i] = pref[2][i - 1];
pref[3][i] = pref[3][i - 1];
x = a - '0';
mainVec[i] = x;
pref[x][i]++;
}
suf[mainVec[n - 1]][n - 1]++;
for (int i = n - 2; i >= 0; i--) {
suf[1][i] = suf[1][i + 1];
suf[2][i] = suf[2][i + 1];
suf[3][i] = suf[3][i + 1];
suf[mainVec[i]][i]++;
}
constexpr bool debug = false;
if constexpr (debug) {
for (auto i : pref[1]) {
std::cout << i;
}
std::cout << "\n";
for (auto i : pref[2]) {
std::cout << i;
}
std::cout << "\n";
for (auto i : pref[3]) {
std::cout << i;
}
std::cout << "\n";
for (auto i : suf[1]) {
std::cout << i;
}
std::cout << "\n";
for (auto i : suf[2]) {
std::cout << i;
}
std::cout << "\n";
for (auto i : suf[3]) {
std::cout << i;
}
std::cout << "\n";
}
if (k >= suf[1][0]) {
x = suf[1][0] + suf[2][0];
x = std::min(x, k);
std::cout << suf[3][0] + x << "\n";
exit(0);
}
int maxResult = -1;
for (int i = t; i < n - t; i++) {
for (int j = i; j < n - t; j++) {
// std::cout << "\n" << i << " " << j << "---";
int wrong = suf[2][i - t] - suf[2][i];
// std::cout << wrong << " ";
wrong += pref[2][j + t] - pref[2][j];
// std::cout << wrong << " ";
if (i > 0) {
wrong += pref[1][i - 1];
}
// std::cout << wrong << " ";
if (j < n - 1) {
wrong += suf[1][j + 1];
}
// std::cout << wrong << " ";
if (wrong <= k) {
int result = 0;
if (i - t > 0) {
result += pref[3][i - t - 1];
result += pref[1][i - t - 1];
}
if (j + t < n - 1) {
result += suf[3][j + t + 1];
result += suf[1][j + t + 1];
}
result += k - wrong;
result = std::min(result, i - t + (n - 1 - (j + t)));
maxResult = std::max(maxResult, result);
}
}
}
std::cout << maxResult << "\n";
exit(0);
}
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 92 93 94 95 96 97 98 99 100 101 102 103 | #include <array> #include <iostream> #include <vector> int main() { std::ios_base::sync_with_stdio(false); int n, k, t; std::cin >> n >> k >> t; char a; std::vector<int> mainVec; mainVec.assign(n, 0); std::array<std::vector<int>, 4> pref, suf; pref.fill(mainVec); suf.fill(mainVec); int x; std::cin >> a; x = a - '0'; mainVec[0] = x; pref[x][0]++; for (int i = 1; i < n; i++) { std::cin >> a; pref[1][i] = pref[1][i - 1]; pref[2][i] = pref[2][i - 1]; pref[3][i] = pref[3][i - 1]; x = a - '0'; mainVec[i] = x; pref[x][i]++; } suf[mainVec[n - 1]][n - 1]++; for (int i = n - 2; i >= 0; i--) { suf[1][i] = suf[1][i + 1]; suf[2][i] = suf[2][i + 1]; suf[3][i] = suf[3][i + 1]; suf[mainVec[i]][i]++; } constexpr bool debug = false; if constexpr (debug) { for (auto i : pref[1]) { std::cout << i; } std::cout << "\n"; for (auto i : pref[2]) { std::cout << i; } std::cout << "\n"; for (auto i : pref[3]) { std::cout << i; } std::cout << "\n"; for (auto i : suf[1]) { std::cout << i; } std::cout << "\n"; for (auto i : suf[2]) { std::cout << i; } std::cout << "\n"; for (auto i : suf[3]) { std::cout << i; } std::cout << "\n"; } if (k >= suf[1][0]) { x = suf[1][0] + suf[2][0]; x = std::min(x, k); std::cout << suf[3][0] + x << "\n"; exit(0); } int maxResult = -1; for (int i = t; i < n - t; i++) { for (int j = i; j < n - t; j++) { // std::cout << "\n" << i << " " << j << "---"; int wrong = suf[2][i - t] - suf[2][i]; // std::cout << wrong << " "; wrong += pref[2][j + t] - pref[2][j]; // std::cout << wrong << " "; if (i > 0) { wrong += pref[1][i - 1]; } // std::cout << wrong << " "; if (j < n - 1) { wrong += suf[1][j + 1]; } // std::cout << wrong << " "; if (wrong <= k) { int result = 0; if (i - t > 0) { result += pref[3][i - t - 1]; result += pref[1][i - t - 1]; } if (j + t < n - 1) { result += suf[3][j + t + 1]; result += suf[1][j + t + 1]; } result += k - wrong; result = std::min(result, i - t + (n - 1 - (j + t))); maxResult = std::max(maxResult, result); } } } std::cout << maxResult << "\n"; exit(0); } |
English