#include <array>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solve(int n, int k, int t, const string& s)
{
array<int, 3> cnt{};
for (int i = 0; i < n; ++i)
{
++cnt[s[i] - '1'];
}
if (cnt[0] <= k)
return min(cnt[0] + cnt[1], k) + cnt[2];
int res = -1;
array<int, 3> left{};
for (int i = 0; i < t; ++i)
{
++left[s[i] - '1'];
}
int l = 0;
while (true)
{
if (left[0] + left[1] <= k)
{
array<int, 3> inside{};
array<int, 3> right{};
++inside[s[l + t] - '1'];
int r = l + t + 1;
for (int i = 0; i < t; ++i)
{
++right[s[r + i] - '1'];
}
while (true)
{
array<int, 3> outside{};
for (int i = 0; i < 3; ++i)
{
outside[i] = cnt[i] - left[i] - inside[i] - right[i];
}
if (left[0] + left[1] + right[0] + right[1] + outside[0] <= k)
res = max(res, min(outside[0] + outside[1], k - left[0] - left[1] - right[0] - right[1]) + outside[2]);
if (r + t == n)
break;
++inside[s[r] - '1'];
--right[s[r] - '1'];
++right[s[r + t] - '1'];
++r;
}
}
if (l + 2 * t + 1 == n)
break;
--left[s[l] - '1'];
++left[s[l + t] - '1'];
++l;
}
return res;
}
int main()
{
int n, k, t;
string s;
cin >> n >> k >> t >> s;
int res = solve(n, k, t, s);
cout << res << endl;
return 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 | #include <array> #include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; int solve(int n, int k, int t, const string& s) { array<int, 3> cnt{}; for (int i = 0; i < n; ++i) { ++cnt[s[i] - '1']; } if (cnt[0] <= k) return min(cnt[0] + cnt[1], k) + cnt[2]; int res = -1; array<int, 3> left{}; for (int i = 0; i < t; ++i) { ++left[s[i] - '1']; } int l = 0; while (true) { if (left[0] + left[1] <= k) { array<int, 3> inside{}; array<int, 3> right{}; ++inside[s[l + t] - '1']; int r = l + t + 1; for (int i = 0; i < t; ++i) { ++right[s[r + i] - '1']; } while (true) { array<int, 3> outside{}; for (int i = 0; i < 3; ++i) { outside[i] = cnt[i] - left[i] - inside[i] - right[i]; } if (left[0] + left[1] + right[0] + right[1] + outside[0] <= k) res = max(res, min(outside[0] + outside[1], k - left[0] - left[1] - right[0] - right[1]) + outside[2]); if (r + t == n) break; ++inside[s[r] - '1']; --right[s[r] - '1']; ++right[s[r + t] - '1']; ++r; } } if (l + 2 * t + 1 == n) break; --left[s[l] - '1']; ++left[s[l + t] - '1']; ++l; } return res; } int main() { int n, k, t; string s; cin >> n >> k >> t >> s; int res = solve(n, k, t, s); cout << res << endl; return 0; } |
English