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
#include <cstdio>
#include <algorithm>
using namespace std;

#define MAX 8010

char buf[MAX];
int n,k,t;

int ile[4][MAX];

int ile1(int i,int j) { return ile[1][j]-ile[1][i]; }
int ile2(int i,int j) { return ile[2][j]-ile[2][i]; }
int ile3(int i,int j) { return ile[3][j]-ile[3][i]; }
int ile12(int i,int j) { return ile1(i,j) + ile2(i,j); }
int ile13(int i,int j) { return ile1(i,j) + ile3(i,j); }

int main() {
    scanf("%d %d %d %s",&n,&k,&t, buf);
    for(int k =1; k<=3;k++) 
        for(int i=1;i<=n+1;i++) ile[k][i] = ile[k][i-1] + (buf[i-1] == '0' + k?1:0);

    int result = -1;

    if (ile1(0,n) <= k) result =  n - max(ile12(0,n) - k, 0);

    for(int w=0;w+2*t<=n;w++) {
        for(int p=w+t;p+t<=n;p++) {
            if(ile1(0,w) + ile12(w,w+t)  + ile12(p,p+t) + ile1(p+t,n) <= k) {
                int kn = k - (ile1(0,w) + ile12(w,w+t) + ile12(p,p+t) + ile1(p+t,n));
                int r = ile13(0,w) + ile13(p+t,n) + min(kn, ile2(0,w) + ile2(p+t,n));
                //printf("w:%d p:%d r:%d\n",w,p,r);
                result = max(result, r);
            }
        }
    }
    printf("%d\n", result);
    return 0;
}