#include<bits/stdc++.h>
#define llong long long
#define ldouble long double
#define uint unsigned int
#define ulong unsigned long long
using namespace std;
inline int get_segment(int l, int r, vector<int>& v) { // [l, r]
if (l > r) return 0;
return v[r] - v[l - 1];
}
inline int get_stracone(int l, int r, vector<int>& biuro, vector<int>& zdalne, vector<int>& bajlando, int t) {
int n = biuro.size() - 1;
int num_stracone = 0;
num_stracone += get_segment(1, l - 1 - t, biuro);
num_stracone += get_segment(l - t, l - 1, zdalne) + get_segment(l - t, l - 1, biuro);
num_stracone += get_segment(r + 1, r + t, zdalne) + get_segment(r + 1, r + t, biuro);
num_stracone += get_segment(r + t + 1, n, biuro);
return num_stracone;
}
inline int get_ans(int l, int r, vector<int>& biuro, vector<int>& zdalne, vector<int>& bajlando, int k, int t) {
int n = biuro.size() - 1;
int stracone = get_stracone(l, r, biuro, zdalne, bajlando, t);
if (stracone > k) return -1;
int podroz = get_segment(l - t, l - 1, zdalne) + get_segment(r + 1, r + t, zdalne) +
get_segment(l - t, l - 1, biuro) + get_segment(r + 1, r + t, biuro);
int opcjonalne = k - podroz;
int l_spotkan_w_domu = get_segment(1, l - 1 - t, biuro) + get_segment(1, l - 1 - t, zdalne) +
get_segment(r + t + 1, n, biuro) + get_segment(r + t + 1, n, zdalne);
return get_segment(1, l - 1 - t, bajlando) + get_segment(r + t + 1, n, bajlando) + min(opcjonalne, l_spotkan_w_domu);
}
void solve() {
int n, k, t; cin >> n >> k >> t;
string s; cin >> s;
vector<int> biuro(n + 1, 0), zdalne(n + 1, 0), bajlando(n + 1, 0);
for (int i = 0; i < n; i++) {
biuro[i + 1] = biuro[i];
zdalne[i + 1] = zdalne[i];
bajlando[i + 1] = bajlando[i];
if (s[i] == '1') biuro[i + 1]++;
if (s[i] == '2') zdalne[i + 1]++;
if (s[i] == '3') bajlando[i + 1]++;
}
int ans = -1;
for (int i = t + 1; i <= n - t; i++) {
for (int j = i; j <= n - t; j++) {
ans = max(ans, get_ans(i, j, biuro, zdalne, bajlando, k, t));
}
}
int stracone = get_segment(1, n, biuro);
if (stracone <= k) {
int l_spotkan_w_domu = get_segment(1, n, biuro) + get_segment(1, n, zdalne);
ans = max(ans, get_segment(1, n, bajlando) + min(k, l_spotkan_w_domu));
}
cout << ans << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
solve();
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 | #include<bits/stdc++.h> #define llong long long #define ldouble long double #define uint unsigned int #define ulong unsigned long long using namespace std; inline int get_segment(int l, int r, vector<int>& v) { // [l, r] if (l > r) return 0; return v[r] - v[l - 1]; } inline int get_stracone(int l, int r, vector<int>& biuro, vector<int>& zdalne, vector<int>& bajlando, int t) { int n = biuro.size() - 1; int num_stracone = 0; num_stracone += get_segment(1, l - 1 - t, biuro); num_stracone += get_segment(l - t, l - 1, zdalne) + get_segment(l - t, l - 1, biuro); num_stracone += get_segment(r + 1, r + t, zdalne) + get_segment(r + 1, r + t, biuro); num_stracone += get_segment(r + t + 1, n, biuro); return num_stracone; } inline int get_ans(int l, int r, vector<int>& biuro, vector<int>& zdalne, vector<int>& bajlando, int k, int t) { int n = biuro.size() - 1; int stracone = get_stracone(l, r, biuro, zdalne, bajlando, t); if (stracone > k) return -1; int podroz = get_segment(l - t, l - 1, zdalne) + get_segment(r + 1, r + t, zdalne) + get_segment(l - t, l - 1, biuro) + get_segment(r + 1, r + t, biuro); int opcjonalne = k - podroz; int l_spotkan_w_domu = get_segment(1, l - 1 - t, biuro) + get_segment(1, l - 1 - t, zdalne) + get_segment(r + t + 1, n, biuro) + get_segment(r + t + 1, n, zdalne); return get_segment(1, l - 1 - t, bajlando) + get_segment(r + t + 1, n, bajlando) + min(opcjonalne, l_spotkan_w_domu); } void solve() { int n, k, t; cin >> n >> k >> t; string s; cin >> s; vector<int> biuro(n + 1, 0), zdalne(n + 1, 0), bajlando(n + 1, 0); for (int i = 0; i < n; i++) { biuro[i + 1] = biuro[i]; zdalne[i + 1] = zdalne[i]; bajlando[i + 1] = bajlando[i]; if (s[i] == '1') biuro[i + 1]++; if (s[i] == '2') zdalne[i + 1]++; if (s[i] == '3') bajlando[i + 1]++; } int ans = -1; for (int i = t + 1; i <= n - t; i++) { for (int j = i; j <= n - t; j++) { ans = max(ans, get_ans(i, j, biuro, zdalne, bajlando, k, t)); } } int stracone = get_segment(1, n, biuro); if (stracone <= k) { int l_spotkan_w_domu = get_segment(1, n, biuro) + get_segment(1, n, zdalne); ans = max(ans, get_segment(1, n, bajlando) + min(k, l_spotkan_w_domu)); } cout << ans << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); solve(); return 0; } |
English