#include<bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define pb push_back #define ld long double #define pi pair<ll, ll> int n, k, t; string s; int uno[8009]; int dos[8009]; int woln[8009]; int jeden(int a, int b){ if(a > b) return 0; return uno[b] - uno[a - 1]; } int dwa(int a, int b){ if(a > b) return 0; return dos[b] - dos[a - 1]; } int trzy(int a, int b){ if(a > b) return 0; return woln[b] - woln[a - 1]; } int main(){ cin>>n>>k>>t>>s; for(int i = 1; i <= n; i++){ uno[i] = uno[i - 1]; dos[i] = dos[i - 1]; woln[i] = woln[i - 1]; if(s[i - 1] == '1') uno[i]++; if(s[i - 1] == '2') dos[i]++; if(s[i - 1] == '3') woln[i]++; } int maksik = -1; int opu = jeden(1, n); if(opu <= k){ maksik = trzy(1, n) + min(k - opu, dwa(1, n)) + opu; } for(int pierwszy = t + 1; pierwszy <= n; pierwszy++){ for(int ostatni = pierwszy; ostatni <= n - t; ostatni++){ int opuszczone = jeden(1, pierwszy - 1) + jeden(ostatni + 1, n) + dwa(pierwszy - t, pierwszy - 1) + dwa(ostatni + 1, ostatni + t); if(opuszczone > k) continue; int wolne = k - opuszczone; int w = trzy(1, pierwszy - t - 1) + trzy(ostatni + t + 1, n); w += jeden(1, pierwszy - t - 1) + jeden(ostatni + t + 1, n); w += min(wolne, dwa(1, pierwszy - t - 1) + dwa(ostatni + t + 1, n)); maksik = max(maksik, w); } } cout<<maksik<<endl; } /* */
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 | #include<bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define pb push_back #define ld long double #define pi pair<ll, ll> int n, k, t; string s; int uno[8009]; int dos[8009]; int woln[8009]; int jeden(int a, int b){ if(a > b) return 0; return uno[b] - uno[a - 1]; } int dwa(int a, int b){ if(a > b) return 0; return dos[b] - dos[a - 1]; } int trzy(int a, int b){ if(a > b) return 0; return woln[b] - woln[a - 1]; } int main(){ cin>>n>>k>>t>>s; for(int i = 1; i <= n; i++){ uno[i] = uno[i - 1]; dos[i] = dos[i - 1]; woln[i] = woln[i - 1]; if(s[i - 1] == '1') uno[i]++; if(s[i - 1] == '2') dos[i]++; if(s[i - 1] == '3') woln[i]++; } int maksik = -1; int opu = jeden(1, n); if(opu <= k){ maksik = trzy(1, n) + min(k - opu, dwa(1, n)) + opu; } for(int pierwszy = t + 1; pierwszy <= n; pierwszy++){ for(int ostatni = pierwszy; ostatni <= n - t; ostatni++){ int opuszczone = jeden(1, pierwszy - 1) + jeden(ostatni + 1, n) + dwa(pierwszy - t, pierwszy - 1) + dwa(ostatni + 1, ostatni + t); if(opuszczone > k) continue; int wolne = k - opuszczone; int w = trzy(1, pierwszy - t - 1) + trzy(ostatni + t + 1, n); w += jeden(1, pierwszy - t - 1) + jeden(ostatni + t + 1, n); w += min(wolne, dwa(1, pierwszy - t - 1) + dwa(ostatni + t + 1, n)); maksik = max(maksik, w); } } cout<<maksik<<endl; } /* */ |