#pragma GCC optimize ("Ofast")
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#define FOR(i, a, b) for (auto i=(a); i<(b); i++)
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()
#ifdef DEBUG
#include "debug.h"
#else
#define dbg(...) 0
#endif
const int maxN = 1 << 13;
int n, k, t, pref[4][maxN];
char T[maxN];
int getCnt(char val, int a, int b)
{
return pref[val - '0'][b - 1] - pref[val - '0'][a - 1];
}
int noOffice()
{
int lost = getCnt('1', 1, n+1);
int remotes = getCnt('2', 1, n+1);
int frees = getCnt('3', 1, n+1);
int remotesToSkip = k - lost;
if (remotesToSkip < 0)
return -1;
int granted = lost + frees;
int remotesSkipped = std::min(remotesToSkip, remotes);
return granted + remotesSkipped;
}
int yesOffice(int a, int b)
{
int homeDep = a - t;
int homeBack = b + t;
int lostStat = getCnt('1', 1, a) + getCnt('1', b, n+1);
int lostRemotes = getCnt('2', homeDep, a) + getCnt('2', b, homeBack);
int lost = lostStat + lostRemotes;
int remotesToSkip = k - lost;
if (remotesToSkip < 0)
return -1;
int inHome = n - (homeBack - homeDep);
int remotesDuringHome = getCnt('2', 1, homeDep) + getCnt('2', homeBack, n+1);
int granted = inHome - remotesDuringHome;
int remotesSkipped = std::min(remotesToSkip, remotesDuringHome);
return granted + remotesSkipped;
}
void solve()
{
scanf ("%d%d%d%s", &n, &k, &t, T+1);
T[n+1] = '0';
FOR(i, 1, n+2)
{
FOR(s, 1, 4)
pref[s][i] = pref[s][i-1];
++pref[T[i] - '0'][i];
}
int res = noOffice();
FOR(a, t+1, n-t+1)
FOR(b, a+1, n-t+2)
res = std::max(res, yesOffice(a, b));
printf("%d\n", res);
}
int main()
{
int tc = 1;
// scanf ("%d", &tc);
FOR(cid, 1, tc+1)
solve();
return 0;
}
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 | #pragma GCC optimize ("Ofast") #define _USE_MATH_DEFINES #include <bits/stdc++.h> #define FOR(i, a, b) for (auto i=(a); i<(b); i++) #define SZ(x) ((int)(x).size()) #define ALL(x) (x).begin(), (x).end() #ifdef DEBUG #include "debug.h" #else #define dbg(...) 0 #endif const int maxN = 1 << 13; int n, k, t, pref[4][maxN]; char T[maxN]; int getCnt(char val, int a, int b) { return pref[val - '0'][b - 1] - pref[val - '0'][a - 1]; } int noOffice() { int lost = getCnt('1', 1, n+1); int remotes = getCnt('2', 1, n+1); int frees = getCnt('3', 1, n+1); int remotesToSkip = k - lost; if (remotesToSkip < 0) return -1; int granted = lost + frees; int remotesSkipped = std::min(remotesToSkip, remotes); return granted + remotesSkipped; } int yesOffice(int a, int b) { int homeDep = a - t; int homeBack = b + t; int lostStat = getCnt('1', 1, a) + getCnt('1', b, n+1); int lostRemotes = getCnt('2', homeDep, a) + getCnt('2', b, homeBack); int lost = lostStat + lostRemotes; int remotesToSkip = k - lost; if (remotesToSkip < 0) return -1; int inHome = n - (homeBack - homeDep); int remotesDuringHome = getCnt('2', 1, homeDep) + getCnt('2', homeBack, n+1); int granted = inHome - remotesDuringHome; int remotesSkipped = std::min(remotesToSkip, remotesDuringHome); return granted + remotesSkipped; } void solve() { scanf ("%d%d%d%s", &n, &k, &t, T+1); T[n+1] = '0'; FOR(i, 1, n+2) { FOR(s, 1, 4) pref[s][i] = pref[s][i-1]; ++pref[T[i] - '0'][i]; } int res = noOffice(); FOR(a, t+1, n-t+1) FOR(b, a+1, n-t+2) res = std::max(res, yesOffice(a, b)); printf("%d\n", res); } int main() { int tc = 1; // scanf ("%d", &tc); FOR(cid, 1, tc+1) solve(); return 0; } |
English