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
#include<iostream>
#include<string>
#include<algorithm>

#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define FORD(i,a,b) for(int i=(a);i>=(b);--i)

using namespace std;

const int MAXN = 8000;

int B[1+MAXN], Z[1+MAXN];

int res, n, k, t;
string s;

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	cin >> n >> k >> t;
	cin >> s;
	
	B[0] = Z[0] = 0;
	REP(i, n) {
		B[i+1] = B[i] + (s[i] == '1');
		Z[i+1] = Z[i] + (s[i] == '2');
	}
	// FOR(i, 0, n) cout << B[i] << " "; cout << endl;	
	// FOR(i, 0, n) cout << Z[i] << " "; cout << endl;
	
	int res = -1;
	
	if (B[n] <= k) {
		res = (Z[n] + B[n] <= k) ? n : (n - B[n] - Z[n] + k);
	}

	int max_x = n - 2*t;
	int max_y = n - t;
	
	FOR(x, 0, max_x) FOR(y, x+t, max_y) {
		int b = B[n] - B[y] + B[x+t];
		int jz = Z[x+t] - Z[x] + Z[y+t] - Z[y];
		if (b + jz > k) continue;
		int dz = Z[x] + Z[n] - Z[y+t];
		int ez = min(dz, k - (b+jz));
		res = max(res, x + n - y - t + ez - dz);
	}
	
	cout << res << endl;

	return 0;
}