#include <bits/stdc++.h>
using namespace std;
int n, k, t;
string s;
int pref[4][8007];
void init(){
s = '$'+s;
for(int i=1; i<=n; i++){
pref[1][i] = pref[1][i-1];
pref[2][i] = pref[2][i-1];
pref[3][i] = pref[3][i-1];
if(s[i] == '1') pref[1][i]++;
if(s[i] == '2') pref[2][i]++;
if(s[i] == '3') pref[3][i]++;
}
}
int query(int a, int b, int r){
if(b < a) return 0;
return pref[r][b] - pref[r][a-1];
}
int cnt(int sa, int sb, int ka, int kb){
int tam = query(sa,sb,1) + query(sa,sb,2);
int powrot = query(ka,kb,1) + query(ka,kb,2);
int tmp = query(1,sa-1,1) + query(kb+1,n,1); //ile jest spotkan w biurze gdy on jest w domu
if(tam + powrot + tmp > k) return -1;
return query(1,sa-1,3) + query(kb+1,n,3) + tmp +
min(query(1,sa-1,2) + query(kb+1,n,2), k - tam - powrot - tmp);
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> k >> t >> s;
init();
int ans = -1;
for(int i=1; i<=n; i++){ //wyrusza w i, dojezdza w i+t-1
for(int j=i+t; j+t-1<=n; j++){ //wraca w j, dojezdza w j+t
ans = max(ans, cnt(i,i+t-1, j, j+t-1));
}
}
//caly dzien w domu
int tmp = 0;
if(query(1,n,1) <= k){
tmp = query(1,n,3) + query(1,n,1) + min(query(1,n,2), k - query(1,n,1));
ans = max(ans, tmp);
}
cout << ans << '\n';
}
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 | #include <bits/stdc++.h> using namespace std; int n, k, t; string s; int pref[4][8007]; void init(){ s = '$'+s; for(int i=1; i<=n; i++){ pref[1][i] = pref[1][i-1]; pref[2][i] = pref[2][i-1]; pref[3][i] = pref[3][i-1]; if(s[i] == '1') pref[1][i]++; if(s[i] == '2') pref[2][i]++; if(s[i] == '3') pref[3][i]++; } } int query(int a, int b, int r){ if(b < a) return 0; return pref[r][b] - pref[r][a-1]; } int cnt(int sa, int sb, int ka, int kb){ int tam = query(sa,sb,1) + query(sa,sb,2); int powrot = query(ka,kb,1) + query(ka,kb,2); int tmp = query(1,sa-1,1) + query(kb+1,n,1); //ile jest spotkan w biurze gdy on jest w domu if(tam + powrot + tmp > k) return -1; return query(1,sa-1,3) + query(kb+1,n,3) + tmp + min(query(1,sa-1,2) + query(kb+1,n,2), k - tam - powrot - tmp); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k >> t >> s; init(); int ans = -1; for(int i=1; i<=n; i++){ //wyrusza w i, dojezdza w i+t-1 for(int j=i+t; j+t-1<=n; j++){ //wraca w j, dojezdza w j+t ans = max(ans, cnt(i,i+t-1, j, j+t-1)); } } //caly dzien w domu int tmp = 0; if(query(1,n,1) <= k){ tmp = query(1,n,3) + query(1,n,1) + min(query(1,n,2), k - query(1,n,1)); ans = max(ans, tmp); } cout << ans << '\n'; } |
English