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

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef vector<bool> vb;

#define eb emplace_back
#define pb push_back
#define loop(i, a, b) for (int i = a; i < b; i++)
#define rloop(i, a, b) for (int i = a; i >= b; i--)
#define all(x) (x).begin(), (x).end()

int main()
{
    cin.tie(0)->sync_with_stdio(false);

    int n, k, t, wyn = -1;
    char c;

    cin >> n >> k >> t;

    vi ilBiur(n + 1), ilZd(n + 1), ilWoln(n + 1);

    for (int i = 1; i <= n; i++)
    {
        cin >> c;
        ilBiur[i] += ilBiur[i - 1];
        ilZd[i] += ilZd[i - 1];
        ilWoln[i] += ilWoln[i - 1];

        if (c == '1')
            ilBiur[i]++;
        else if (c == '2')
            ilZd[i]++;
        else
            ilWoln[i]++;
    }

    int ileBiurowych = ilBiur[n] - ilBiur[0];

    if (ileBiurowych <= k)
    {
        int ileZdalnychMozeOpuscic = min(k - ileBiurowych, ilZd[n] - ilZd[0]);
        wyn = ileZdalnychMozeOpuscic + ileBiurowych + (ilWoln[n] - ilWoln[0]);
    }

    for (int i = 1; i <= n - (2 * t) + 1; i++)
    {
        int domil1 = ilBiur[i-1] - ilBiur[0];
        int domil2 = ilZd[i-1] - ilZd[0];
        int domil3 = ilWoln[i-1] - ilWoln[0];
        int opuszczoneSpNaDojazd = (ilBiur[i + t - 1] - ilBiur[i - 1]) + (ilZd[i + t - 1] - ilZd[i - 1]);

        for (int j = i + t; j <= n - t + 1; j++)
        {
            int opuszczoneSpNaDojazd2 = (ilBiur[j + t - 1] - ilBiur[j - 1]) + (ilZd[j + t - 1] - ilZd[j - 1]);
            int lacznieOpSpNaDoj = opuszczoneSpNaDojazd + opuszczoneSpNaDojazd2;

            int domPil1 = ilBiur[n] - ilBiur[j + t - 1];
            int domPil2 = ilZd[n] - ilZd[j + t - 1];
            int domPil3 = ilWoln[n] - ilWoln[j + t - 1];

            int calIl1 = domil1 + domPil1;
            int calIl2 = domil2 + domPil2;
            int calIl3 = domil3 + domPil3;

            if (calIl1 + lacznieOpSpNaDoj > k)
                continue;

            int ileZdalnychMozeOpuscic = min(k - calIl1 - lacznieOpSpNaDoj, calIl2);
            wyn = max(calIl1 + calIl3 + ileZdalnychMozeOpuscic, wyn);
        }
    }

    cout << wyn;
    return 0;
}