#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; } |