#define debug 0 #include <bits/stdc++.h> #define fastio() ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define perf 1 #define st first #define nd second #define remin(a,b) a=min(a,b); #define remax(a,b) a=max(a,b); #define mod 998244353 //#define mod 1'000'000'007 using namespace std; constexpr static int inf = 1e9; vector<int> one, two, both; inline int sm(const vector<int>& v, int l, int r) { //returns sum [l, r] i=l, i <= r if (l > r) return 0; return v[r+1]-v[l]; //zero-indexed } void solve() { int n, k, t; string s; cin >> n >> k >> t >> s; both.assign(n+1, 0); one.assign(n+1, 0); two.assign(n+1, 0); for (int i = 0; i < n; ++i) { if (s[i] == '1') { ++one[i+1]; ++both[i+1]; } if (s[i] == '2') { ++two[i+1]; ++both[i+1]; } one[i+1] += one[i]; two[i+1] += two[i]; both[i+1] += both[i]; } int ans = - inf; if (one[n] <= k) { if (debug) cerr << "get out of jail free\n"; remax(ans, n-max(0, both[n]-k)); //nie trzeba jechac do biura, zeby byc na spotkaniach } //jedziemy do biura w godzinach [l, l+t-1] wlacznie, oraz [r, r+t-1] for (int l = 0; l <= n - t; ++l) { //wyjazd w momencie l for (int r = l+t; r <= n - t; ++r) { //wyjazd do domu w momencie r, nie ma sensu r=l+t, bo wtedy nie mamy szansy pracowac xd int prac_biur = sm(both, l+t, r-1); int prac_dom = sm(two, 0, l-1) + sm(two, r+t, n-1); if (debug) { cerr << "l " << l << " r " << r << " prac biur " << prac_biur << " prac dom " << prac_dom << " ans " << ans << '\n'; } //ans = -inf; if (both[n] - (prac_biur + prac_dom) <= k) { int dom = l-1+1 + (n-1 - (r+t) + 1); if (both[n] - prac_biur > k) dom -= (both[n] - prac_biur) - k; remax(ans, dom); } } } if (debug) { cerr << "the actual ans is: " << ans << '\n'; } if (ans < 0) cout << -1 << '\n'; else cout << ans << '\n'; } int main() { fastio(); int t=1; //cin >> t; while (t--) { 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 79 80 81 82 83 84 85 86 87 88 89 90 | #define debug 0 #include <bits/stdc++.h> #define fastio() ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define perf 1 #define st first #define nd second #define remin(a,b) a=min(a,b); #define remax(a,b) a=max(a,b); #define mod 998244353 //#define mod 1'000'000'007 using namespace std; constexpr static int inf = 1e9; vector<int> one, two, both; inline int sm(const vector<int>& v, int l, int r) { //returns sum [l, r] i=l, i <= r if (l > r) return 0; return v[r+1]-v[l]; //zero-indexed } void solve() { int n, k, t; string s; cin >> n >> k >> t >> s; both.assign(n+1, 0); one.assign(n+1, 0); two.assign(n+1, 0); for (int i = 0; i < n; ++i) { if (s[i] == '1') { ++one[i+1]; ++both[i+1]; } if (s[i] == '2') { ++two[i+1]; ++both[i+1]; } one[i+1] += one[i]; two[i+1] += two[i]; both[i+1] += both[i]; } int ans = - inf; if (one[n] <= k) { if (debug) cerr << "get out of jail free\n"; remax(ans, n-max(0, both[n]-k)); //nie trzeba jechac do biura, zeby byc na spotkaniach } //jedziemy do biura w godzinach [l, l+t-1] wlacznie, oraz [r, r+t-1] for (int l = 0; l <= n - t; ++l) { //wyjazd w momencie l for (int r = l+t; r <= n - t; ++r) { //wyjazd do domu w momencie r, nie ma sensu r=l+t, bo wtedy nie mamy szansy pracowac xd int prac_biur = sm(both, l+t, r-1); int prac_dom = sm(two, 0, l-1) + sm(two, r+t, n-1); if (debug) { cerr << "l " << l << " r " << r << " prac biur " << prac_biur << " prac dom " << prac_dom << " ans " << ans << '\n'; } //ans = -inf; if (both[n] - (prac_biur + prac_dom) <= k) { int dom = l-1+1 + (n-1 - (r+t) + 1); if (both[n] - prac_biur > k) dom -= (both[n] - prac_biur) - k; remax(ans, dom); } } } if (debug) { cerr << "the actual ans is: " << ans << '\n'; } if (ans < 0) cout << -1 << '\n'; else cout << ans << '\n'; } int main() { fastio(); int t=1; //cin >> t; while (t--) { solve(); } return 0; } |