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

using namespace std;
typedef long long ll;
const int MAXN=8000;

char arr[MAXN+5];
int prefD[MAXN+5]; //w domu
int prefBD[MAXN+5]; //w biurze lub w domu

int qryD(int l, int r)
{
	return prefD[r]-prefD[l-1];
}

int qryBD(int l, int r)
{
	return prefBD[r]-prefBD[l-1];
}

void solve()
{
	int n,k,t;
	cin >> n >> k >> t;
	int wszystkie_spotkania=0;
	for(int i=1;i<=n;i++){
		cin >> arr[i];
		if(arr[i]!='3') wszystkie_spotkania++;
		prefBD[i]=prefBD[i-1];
		prefD[i]=prefD[i-1];
		if(arr[i]=='1' || arr[i]=='2') prefBD[i]++;
		if(arr[i]=='2') prefD[i]++;
	}
	int ans=-1;
	int p=max(0,wszystkie_spotkania-k); //na ilu musi byc
	//nie jedzie w ogole
	if(qryD(1, n) >= p){
		ans=max(ans,n-p);
	}
	// jedzie na jakis przedzial
	for(int i=t+1;i<=n;i++){
		for(int j=i;j<=n-t;j++){
			int x=i-t-1;
			int y=j+t+1;
			if(qryBD(i, j) + qryD(1, x) + qryD(y, n) >= p){
				int dl = x + (n-y+1);
				int q = max(0, p-qryBD(i,j));
				ans=max(ans,dl-q);
			}
		}
	}
	cout << ans;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	solve();
	
	return 0;
}