#include <bits/stdc++.h>
using namespace std;
int n, k, t, res = -1;
int sum[4];
int const N_max=8000;
string s;
vector <int> path;
int pref_1[N_max];
int suff_1[N_max];
int pref_free[N_max];
int suff_free[N_max];
//pref && suff for 2;
int twos_from_left[N_max];
int twos_from_right[N_max];
void convert_path(){
for (int i=0; i<n; i++){
int num=s[i]-'0';
path.push_back(num);
sum[num]++;
}
return;
}
void fill_arrays(){
if (path[0]==1){pref_1[0]=1;}
for (int i=1; i<n; i++){
if (path[i]==1){
pref_1[i]=pref_1[i-1]+1;
}
else{pref_1[i]=pref_1[i-1];}
if (path[i-1]==3){
pref_free[i]=pref_free[i-1]+1;
}
else{pref_free[i]=pref_free[i-1];}
}
if (path[n-1]==1){suff_1[n-1]=1;}
for(int i=n-1; i>=0; i--){
if (path[i]==1){
suff_1[i]=suff_1[i+1]+1;
}
else{suff_1[i]=suff_1[i+1];}
if (path[i+1]==3){
suff_free[i]=suff_free[i+1]+1;
}
else{suff_free[i]=suff_free[i+1];}
}
/*for (int i=0; i<n; i++){
pref_1[i]=suff_1[n-1-i];
pref_free[i]=suff_free[n-1-i];
}*/
int tfr_t=0;
for(int i=n-1; i>n-1-t; i--){if(path[i]==2){tfr_t++;}}
twos_from_right[n-t]=tfr_t;
for (int i=n-t - 1; i>=0; i--){
int act=twos_from_right[i+1];
if (path[i]==2){act++;}
if (path[i+t]==2){act--;}
twos_from_right[i]=act;
}
int tfl_t=0;
for(int i=0; i<t; i++){if(path[i]==2){tfl_t++;}}
twos_from_left[t-1]=tfl_t;
for (int i=t; i<n; i++){
int act=twos_from_left[i-1];
if (path[i]==2){act++;}
if (path[i-t]==2){act--;}
twos_from_left[i]=act;
}
return;
}
int find_result(int left, int right){
int mm=pref_1[left+t-1]+suff_1[right-t+1]+twos_from_right[left]+twos_from_left[right];
//if (left==3 && right==7){cout<<"\n"<<mm; exit(0);}
if (mm>k){return -1;}
//if (left==3 && right==7){cout<<"\n"<<pref_free[left]+suff_free[right]; exit(0);}
return pref_free[left]+suff_free[right]+ (k-mm);
}
void debug(){
cout<<"pref_1"<<"\n";
for(int i=0; i<n; i++){cout<<pref_1[i]<<" ";}
cout<<"\n"<<"suff_1"<<"\n";
for(int i=0; i<n; i++){cout<<suff_1[i]<<" ";}
cout<<"\n"<<"pref_free\n";
for(int i=0; i<n; i++){cout<<pref_free[i]<<" ";}
cout<<"\n"<<"suff_free\n";
for(int i=0; i<n; i++){cout<<suff_free[i]<<" ";}
cout<<"\n"<<"twos_from_left\n";
for(int i=0; i<n; i++){cout<<twos_from_left[i]<<" ";}
cout<<"\n"<<"twos_from_right\n";
for(int i=0; i<n; i++){cout<<twos_from_right[i]<<" ";}
}
int main()
{
cin>>n>>k>>t;
cin>>s;
convert_path();
fill_arrays();
if (k>=sum[1]+sum[2]){cout<<s.size(); return 0;}
pair <int, int> lr={-1, -1};
//debug();
//return 0;
for (int i=0; i<n-t; i++){
for(int j=i+(2*t); j<n; j++){
if (res<find_result(i, j)){
lr={i, j};
res=find_result(i, j);
}
}
}
cout<<res;
//cout<<"\n"<<find_result(3, 7);
//cout<<"\n"<<lr.first<<" "<<lr.second;
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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #include <bits/stdc++.h> using namespace std; int n, k, t, res = -1; int sum[4]; int const N_max=8000; string s; vector <int> path; int pref_1[N_max]; int suff_1[N_max]; int pref_free[N_max]; int suff_free[N_max]; //pref && suff for 2; int twos_from_left[N_max]; int twos_from_right[N_max]; void convert_path(){ for (int i=0; i<n; i++){ int num=s[i]-'0'; path.push_back(num); sum[num]++; } return; } void fill_arrays(){ if (path[0]==1){pref_1[0]=1;} for (int i=1; i<n; i++){ if (path[i]==1){ pref_1[i]=pref_1[i-1]+1; } else{pref_1[i]=pref_1[i-1];} if (path[i-1]==3){ pref_free[i]=pref_free[i-1]+1; } else{pref_free[i]=pref_free[i-1];} } if (path[n-1]==1){suff_1[n-1]=1;} for(int i=n-1; i>=0; i--){ if (path[i]==1){ suff_1[i]=suff_1[i+1]+1; } else{suff_1[i]=suff_1[i+1];} if (path[i+1]==3){ suff_free[i]=suff_free[i+1]+1; } else{suff_free[i]=suff_free[i+1];} } /*for (int i=0; i<n; i++){ pref_1[i]=suff_1[n-1-i]; pref_free[i]=suff_free[n-1-i]; }*/ int tfr_t=0; for(int i=n-1; i>n-1-t; i--){if(path[i]==2){tfr_t++;}} twos_from_right[n-t]=tfr_t; for (int i=n-t - 1; i>=0; i--){ int act=twos_from_right[i+1]; if (path[i]==2){act++;} if (path[i+t]==2){act--;} twos_from_right[i]=act; } int tfl_t=0; for(int i=0; i<t; i++){if(path[i]==2){tfl_t++;}} twos_from_left[t-1]=tfl_t; for (int i=t; i<n; i++){ int act=twos_from_left[i-1]; if (path[i]==2){act++;} if (path[i-t]==2){act--;} twos_from_left[i]=act; } return; } int find_result(int left, int right){ int mm=pref_1[left+t-1]+suff_1[right-t+1]+twos_from_right[left]+twos_from_left[right]; //if (left==3 && right==7){cout<<"\n"<<mm; exit(0);} if (mm>k){return -1;} //if (left==3 && right==7){cout<<"\n"<<pref_free[left]+suff_free[right]; exit(0);} return pref_free[left]+suff_free[right]+ (k-mm); } void debug(){ cout<<"pref_1"<<"\n"; for(int i=0; i<n; i++){cout<<pref_1[i]<<" ";} cout<<"\n"<<"suff_1"<<"\n"; for(int i=0; i<n; i++){cout<<suff_1[i]<<" ";} cout<<"\n"<<"pref_free\n"; for(int i=0; i<n; i++){cout<<pref_free[i]<<" ";} cout<<"\n"<<"suff_free\n"; for(int i=0; i<n; i++){cout<<suff_free[i]<<" ";} cout<<"\n"<<"twos_from_left\n"; for(int i=0; i<n; i++){cout<<twos_from_left[i]<<" ";} cout<<"\n"<<"twos_from_right\n"; for(int i=0; i<n; i++){cout<<twos_from_right[i]<<" ";} } int main() { cin>>n>>k>>t; cin>>s; convert_path(); fill_arrays(); if (k>=sum[1]+sum[2]){cout<<s.size(); return 0;} pair <int, int> lr={-1, -1}; //debug(); //return 0; for (int i=0; i<n-t; i++){ for(int j=i+(2*t); j<n; j++){ if (res<find_result(i, j)){ lr={i, j}; res=find_result(i, j); } } } cout<<res; //cout<<"\n"<<find_result(3, 7); //cout<<"\n"<<lr.first<<" "<<lr.second; return 0; } |
English