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

static const char FREE = '3';
static const char REMOTE = '2';
static const char OFFICE = '1';

inline int get_sum(vector<int> &sum_arr, int l, int r){
    if (l < 0 || r < 0 || l > r)
        return 0;
    return sum_arr[r+1] - sum_arr[l];
}

int check_for_given_params(vector<int> &frees_sum, vector<int> &remotes_sum, vector<int> &offices_sum,
        int l, int r, int u, int t, int n) {
    int num_of_mettings_in_office = get_sum(remotes_sum, l, r) + get_sum(offices_sum, l, r);
    int num_of_mettings_remotely = remotes_sum[n+1] - get_sum(remotes_sum, l - t, r + t);
    if (num_of_mettings_remotely + num_of_mettings_in_office < u)
        return -1;
    return (frees_sum[n+1] - get_sum(frees_sum, l-t, r + t) +
        offices_sum[n+1] - get_sum(offices_sum, l-t, r+t) +
        min(num_of_mettings_remotely, num_of_mettings_remotely + num_of_mettings_in_office - u)
        );
}

int main() {
    ios_base::sync_with_stdio(false);
    int n, u, t;
    cin >> n >> u >> t;
    string days;
    cin >> days;
    vector<int> frees_sum(n+2, 0);
    vector<int> remotes_sum(n+2, 0);
    vector<int> offices_sum(n+2, 0);
    for (int k=0;k < n; k++) {
        frees_sum[k+1] = frees_sum[k];
        remotes_sum[k+1] = remotes_sum[k];
        offices_sum[k+1] = offices_sum[k];
        if(days[k] == FREE)
            frees_sum[k+1]++;
        else if(days[k] == REMOTE)
            remotes_sum[k+1]++;
        else if(days[k] == OFFICE)
            offices_sum[k+1]++;
    }
    frees_sum[n+1] = frees_sum[n];
    remotes_sum[n+1] = remotes_sum[n];
    offices_sum[n+1] = offices_sum[n];
    u = max(remotes_sum[n] + offices_sum[n] - u, 0);
    if (remotes_sum[n] >= u) {
        cout << n - u;
        return 0;
    }
    
    int result = -1;
    for (int l = t; l < n - t; l++) {
        for (int r = l; r < n - t; r++) {
            int range_res = check_for_given_params(frees_sum, remotes_sum, offices_sum, l, r, u, t, n);
            result = max(result, range_res);
        }
    }
    cout << result;
}