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
#include <bits/stdc++.h>
using namespace std;
int spotk[8002], zd[8002], wolne[8002];

int main() {
	ios_base::sync_with_stdio(0);
	int n, k, t;
	unsigned int i, j;
	string dane;
	cin >> n >> k >> t;
	cin >> dane;
	dane = '#' + dane + '#';
	for(i = 1; i <= n; i++) {
		if (dane[i] =='1') {
			spotk[i] = spotk[i-1] + 1;
			wolne[i] = wolne[i-1];
			zd[i] = zd[i-1];
		}
		else if (dane[i] =='2') {
			zd[i] = zd[i-1] + 1;
			spotk[i] = spotk[i-1];
			wolne[i] = wolne[i-1];
		}
		else{
			zd[i] = zd[i-1] ;
			spotk[i] = spotk[i-1];
			wolne[i] = wolne[i-1] + 1;
		}
	}
	int spotkania = max(0,spotk[n] + zd[n] - k);
	//cout << "spotkania" << spotkania << endl;
	int wbiurze = max(0,spotk[n] - k);
	if (wbiurze == 0) t = 0;
	//cout << "wbiurze" << wbiurze << endl;
	int zdalne = spotkania - wbiurze;
	//cout << "zdalne" << zdalne << endl;
	int wyn = -1, aktzdalne, aktwbiurze;
	for(i = 1; i <= n - 2*t; i++) {
		//cout <<"i=" << i <<" ";
		for(j = i + 2*t - 1; j <= n; j++){
			//cout << "j =" << j <<" ";
			aktwbiurze = spotk[j - t] - spotk[i + t -1];
			//cout << "aktwbiurze" << aktwbiurze << endl;
			aktzdalne = zd[i-1] + (zd[n] - zd[j]) + (zd[j-t] - zd[i + t-1]);
			//cout << "aktzdalne" << aktzdalne << endl;
			if (aktwbiurze >= wbiurze && aktwbiurze + aktzdalne >= spotkania){
				int zdalnewdomu = spotkania - aktwbiurze - (zd[j-t] - zd[i + t -1]);
				int kodowanie = i - 1 + (n -j) - zdalnewdomu;
				//cout << "kodowanie" << kodowanie << endl;
				wyn = max(kodowanie, wyn);				
			}
		}
	}

	cout << wyn;


	return 0;
}