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
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <algorithm>
#include <bitset>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>

using namespace std;

#define PB push_back
#define MP make_pair
#define F first
#define S second
#define ALL(x) (x).begin(),(x).end()
#define SIZE(x) (int)(x).size()
#define CLEAR(tab) memset(tab, 0, sizeof(tab))
#define REP(x, n) for(int x = 0; x < (n); x++)
#define FOR(x, b, e) for(int x = (b); x <= (e); x++)
#define FORD(x, b, e) for(int x = (b); x >= (e); x--)
#define VAR(v, n) __typeof(n) v = (n)
#define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)
#define DEBUG(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)

typedef long long int LL;
typedef pair<int,int> PII;
typedef vector<int> VI;

const int MXN = 8010;
const int C = 262144;
const int INF = 1000000001;
const int MOD = 1000000007;

int a[MXN];
int pref_b[MXN], pref_z[MXN], pref_w[MXN];
int suf_b[MXN], suf_z[MXN], suf_w[MXN];
int n, k, t;

int calc(int x, int y) {
    int b = pref_b[x - 1] + suf_b[y + 1];
    int z = pref_z[x - 1] + suf_z[y + 1];
    int w = pref_w[x - 1] + suf_w[y + 1];

    int op_b = pref_b[x + t - 1] - pref_b[x - 1];
    op_b += pref_b[y] - pref_b[y - t];

    int op_z = pref_z[x + t - 1] - pref_z[x - 1];
    op_z += pref_z[y] - pref_z[y - t];

    int opuszczone = op_b + op_z + b;
    if(k < opuszczone)
        return -1;

    int res = w + b;
    
    res += min(k - opuszczone, z);
    return res;
}

int calc2() {
    int b = pref_b[n];
    int z = pref_z[n];
    int w = pref_w[n];

    if(k < b)
        return -1;

    int res = w + b;

    res += min(k - b, z);
    return res;
}

void test() {
    scanf("%d %d %d", &n, &k, &t);
    FOR(i, 1, n) {
        int x;
        char zn;
        while(1) {
            zn = getchar();
            if(isdigit(zn) ) {
                x = zn - '0';
                break;
            }
        }
        a[i] = x;
    }
    FOR(i, 1, n) {
        pref_b[i] = pref_b[i - 1] + (a[i] == 1);
        pref_z[i] = pref_z[i - 1] + (a[i] == 2);
        pref_w[i] = pref_w[i - 1] + (a[i] == 3);
    }
    FORD(i, n, 1) {
        suf_b[i] = suf_b[i + 1] + (a[i] == 1);
        suf_z[i] = suf_z[i + 1] + (a[i] == 2);
        suf_w[i] = suf_w[i + 1] + (a[i] == 3);
    }

    int res = calc2();
    FOR(i, 1, n)
        FOR(j, i + 1, n) {
            if(j - i + 1 >= 2 * t)
                res = max(res, calc(i, j));
        }
    printf("%d\n", res);
}

int main() {
	int te = 1;
	//scanf("%d", &te);
	while(te--)
		test();
	return 0;
}