#include <bits/stdc++.h>
using namespace std;
int sBiuro(int a, int b, vector<int> &biuro){
return biuro[b] - biuro[a];
}
int sZdalne(int a, int b, vector<int> &zdalne){
return zdalne[b] - zdalne[a];
}
int sZadanka(int a, int b, vector<int> &zadanka){
return zadanka[b] - zadanka[a];
}
int wSpotkania(int a, int b, vector<int> &zdalne, vector<int> &biuro){
return zdalne[b] - zdalne[a] + biuro[b] - biuro[a];
}
int main(){
int n, k, t;
cin >> n >> k >> t;
string s;
cin >> s;
vector<int> zd(n+1), b(n+1), w(n+1);
for(int i = 1; i <= n; ++i){
zd[i] = zd[i - 1];
b[i] = b[i - 1];
w[i] = w[i - 1];
if(s[i - 1] == '1') b[i]++;
else if(s[i - 1] == '2') zd[i]++;
else w[i]++;
}
int wynik = -1; bool tak = 0;
if(b[n] <= k){
int wolne = k - b[n];
if(wolne > zd[n]) wynik = zd[n] + b[n] + w[n];
else wynik = wolne + b[n] + w[n];
tak = 1;
}
for(int x = t + 1; x <= n - t; ++x){
for(int y = x; y <= n - t; ++y){
int b_dom = sBiuro(0, x - t- 1, b) + sBiuro(y + t, n, b);
int ominiete = wSpotkania(y, y + t, zd, b) + wSpotkania(x - 1 - t, x - 1, zd, b);
ominiete += b_dom;
int n_wynik = b_dom;
int c_zadanka = sZadanka(0, x - t - 1, w) + sZadanka(y + t, n, w);
if(ominiete > k) continue;
int wolne = k - ominiete;
int z_dom = sZdalne(0, x - t - 1, zd) + sZdalne(y + t, n, zd);
if(wolne > z_dom) n_wynik += c_zadanka + z_dom;
else n_wynik += c_zadanka + wolne;
if(n_wynik > wynik){
wynik = n_wynik;
tak = 1;
}
}
}
if(!tak) cout << "-1\n";
else cout << wynik << "\n";
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 | #include <bits/stdc++.h> using namespace std; int sBiuro(int a, int b, vector<int> &biuro){ return biuro[b] - biuro[a]; } int sZdalne(int a, int b, vector<int> &zdalne){ return zdalne[b] - zdalne[a]; } int sZadanka(int a, int b, vector<int> &zadanka){ return zadanka[b] - zadanka[a]; } int wSpotkania(int a, int b, vector<int> &zdalne, vector<int> &biuro){ return zdalne[b] - zdalne[a] + biuro[b] - biuro[a]; } int main(){ int n, k, t; cin >> n >> k >> t; string s; cin >> s; vector<int> zd(n+1), b(n+1), w(n+1); for(int i = 1; i <= n; ++i){ zd[i] = zd[i - 1]; b[i] = b[i - 1]; w[i] = w[i - 1]; if(s[i - 1] == '1') b[i]++; else if(s[i - 1] == '2') zd[i]++; else w[i]++; } int wynik = -1; bool tak = 0; if(b[n] <= k){ int wolne = k - b[n]; if(wolne > zd[n]) wynik = zd[n] + b[n] + w[n]; else wynik = wolne + b[n] + w[n]; tak = 1; } for(int x = t + 1; x <= n - t; ++x){ for(int y = x; y <= n - t; ++y){ int b_dom = sBiuro(0, x - t- 1, b) + sBiuro(y + t, n, b); int ominiete = wSpotkania(y, y + t, zd, b) + wSpotkania(x - 1 - t, x - 1, zd, b); ominiete += b_dom; int n_wynik = b_dom; int c_zadanka = sZadanka(0, x - t - 1, w) + sZadanka(y + t, n, w); if(ominiete > k) continue; int wolne = k - ominiete; int z_dom = sZdalne(0, x - t - 1, zd) + sZdalne(y + t, n, zd); if(wolne > z_dom) n_wynik += c_zadanka + z_dom; else n_wynik += c_zadanka + wolne; if(n_wynik > wynik){ wynik = n_wynik; tak = 1; } } } if(!tak) cout << "-1\n"; else cout << wynik << "\n"; return 0; } |
English