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
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define s second
#define ll long long
#define dbg(x) cerr << #x << ": " << x << "\n"
#define mp make_pair

using namespace std;

const int N = 8005;
int tab[N];
int pre[N][5];

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

    int n, k, t;
    cin >> n >> k >> t;

    for (int i = 1; i <= n; i++)
    {
        char a;
        cin >> a;
        tab[i] = a - '0';
    }

    for (int num = 1; num <= 3; num++)
    {
        for (int i = 1; i <= n; i++)
        {
            pre[i][num] = pre[i - 1][num] + (tab[i] == num);
        }
    }

    int res = -1;

    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            int bad = 0;
            int good = 0;
            if (j - i + 1 < 2 * t)
                continue;
            bad += pre[i + t - 1][1] - pre[i - 1][1];
            bad += pre[i + t - 1][2] - pre[i - 1][2];
            bad += pre[j][1] - pre[j - t][1];
            bad += pre[j][2] - pre[j - t][2];
            bad += pre[i - 1][1];
            bad += pre[n][1] - pre[j][1];

            if (bad > k)
                continue;
            good += pre[i - 1][1];
            good += pre[n][1] - pre[j][1];
            good += pre[i - 1][3];
            good += pre[n][3] - pre[j][3];

            good += min(bad - k, pre[i - 1][2] + pre[n][2] - pre[j][2]);

            res = max(res, good);
        }
    }

    if (pre[n][1] <= k)
    {
        res = max(res, pre[n][1] + pre[n][3] + min(k - pre[n][1], pre[n][2]));
    }

    cout << res;

    return 0;
}