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