#include<iostream>
#include<algorithm>
using namespace std;
int n,k,t,mus;
string s;
int best=-1;
void raise(int &best, int res){
if(res>best)best=res;
}
int c1[8192][8192],c2[8192][8192];
void check(string d,string b){
int rob=count(b.begin(),b.end(),'1')+count(b.begin(),b.end(),'2');
int opt=count(d.begin(),d.end(),'2');
if(rob+opt>=mus)raise(best,d.size()-max(0,mus-rob));
}
#define REP(i,n) for(int i=0;i<n;++i)
int main(){
cin>>n>>k>>t>>s;
REP(e,n+1)for(int b=e-1;b>=0;b--){
c1[b][e]=c1[b+1][e]+('1'==s[b]);
c2[b][e]=c2[b+1][e]+('2'==s[b]);
}
mus=count(s.begin(),s.end(),'1')+count(s.begin(),s.end(),'2')-k;
check(s,"");
for(int d=0;d+t+t<=n;++d)for(int p=0;d+t+p+t<=n;++p){
// check(s.substr(0,d)+s.substr(d+t+p+t),s.substr(d+t,p));
int rob=c1[d+t][d+t+p]+c2[d+t][d+t+p];
int opt=c2[0][d]+c2[d+t+p+t][n];
if(rob+opt>=mus)raise(best,d+(n-(d+t+p+t))-max(0,mus-rob));
}
cout<<best;
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 | #include<iostream> #include<algorithm> using namespace std; int n,k,t,mus; string s; int best=-1; void raise(int &best, int res){ if(res>best)best=res; } int c1[8192][8192],c2[8192][8192]; void check(string d,string b){ int rob=count(b.begin(),b.end(),'1')+count(b.begin(),b.end(),'2'); int opt=count(d.begin(),d.end(),'2'); if(rob+opt>=mus)raise(best,d.size()-max(0,mus-rob)); } #define REP(i,n) for(int i=0;i<n;++i) int main(){ cin>>n>>k>>t>>s; REP(e,n+1)for(int b=e-1;b>=0;b--){ c1[b][e]=c1[b+1][e]+('1'==s[b]); c2[b][e]=c2[b+1][e]+('2'==s[b]); } mus=count(s.begin(),s.end(),'1')+count(s.begin(),s.end(),'2')-k; check(s,""); for(int d=0;d+t+t<=n;++d)for(int p=0;d+t+p+t<=n;++p){ // check(s.substr(0,d)+s.substr(d+t+p+t),s.substr(d+t,p)); int rob=c1[d+t][d+t+p]+c2[d+t][d+t+p]; int opt=c2[0][d]+c2[d+t+p+t][n]; if(rob+opt>=mus)raise(best,d+(n-(d+t+p+t))-max(0,mus-rob)); } cout<<best; return 0; } |
English