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
#include <bits/stdc++.h>

using namespace std;

int sBiuro(int a, int b, vector<int> &biuro){
	return biuro[b] - biuro[a];
}

int sZdalne(int a, int b, vector<int> &zdalne){
	return zdalne[b] - zdalne[a];
}

int sZadanka(int a, int b, vector<int> &zadanka){
	return zadanka[b] - zadanka[a];
}

int wSpotkania(int a, int b, vector<int> &zdalne, vector<int> &biuro){
	return zdalne[b] - zdalne[a] + biuro[b] - biuro[a];
}

int main(){
	
	int n, k, t;
	cin >> n >> k >> t;
	
	string s;
	cin >> s;
	
	vector<int> zd(n+1), b(n+1), w(n+1);	
	for(int i = 1; i <= n; ++i){
		
		zd[i] = zd[i - 1];
		b[i] = b[i - 1];
		w[i] = w[i - 1];
		
		if(s[i - 1] == '1') b[i]++; 
		else if(s[i - 1] == '2') zd[i]++;
		else w[i]++;
	}
	

	int wynik = -1; bool tak = 0;
	
	if(b[n] <= k){
		int wolne = k - b[n];
		if(wolne > zd[n]) wynik = zd[n] + b[n] + w[n];
		else wynik = wolne + b[n] + w[n];
		tak = 1;
	}
	
	for(int x = t + 1; x <= n - t; ++x){
		for(int y = x; y <= n - t; ++y){
			
			int b_dom = sBiuro(0, x - t- 1, b) + sBiuro(y + t, n, b);
			int ominiete = wSpotkania(y, y + t, zd, b) + wSpotkania(x - 1 - t, x - 1, zd, b);
			ominiete += b_dom;
			int n_wynik = b_dom;
				
			int c_zadanka = sZadanka(0, x - t - 1, w) + sZadanka(y + t, n, w);			
			if(ominiete > k) continue;

			int wolne = k - ominiete;
			int z_dom = sZdalne(0, x - t - 1, zd) + sZdalne(y + t, n, zd);
						
			if(wolne > z_dom) n_wynik += c_zadanka + z_dom;
			else n_wynik += c_zadanka + wolne;
			
			if(n_wynik > wynik){
				wynik = n_wynik;
				tak = 1;
			}
		}
	}
	
	if(!tak) cout << "-1\n";
	else cout << wynik << "\n";
	
	return 0;
}