Submission #982944

#TimeUsernameProblemLanguageResultExecution timeMemory
982944LOLOLOMiners (IOI07_miners)C++17
100 / 100
988 ms101128 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;
 
#define           f     first
#define           s     second
#define           pb    push_back
#define           ep    emplace
#define           eb    emplace_back
#define           lb    lower_bound
#define           ub    upper_bound
#define       all(x)    x.begin(), x.end()
#define      rall(x)    x.rbegin(), x.rend()
#define   uniquev(v)    sort(all(v)), (v).resize(unique(all(v)) - (v).begin())
#define     mem(f,x)    memset(f , x , sizeof(f))
#define        sz(x)    (int)(x).size()
#define  __lcm(a, b)    (1ll * ((a) / __gcd((a), (b))) * (b))
#define          mxx    *max_element
#define          mnn    *min_element
#define    cntbit(x)    __builtin_popcountll(x)
#define       len(x)    (int)(x.length())
 
const int N = 1e5 + 10;
int type[N];
int dp[N][16][16], id[16][16];
pair <int, int> f[16];

void maximize(int& a, int b) {
    if (a < b)
        a = b;
}

int cal(pair <int, int> a, int b) {
    vector <bool> used(4, 0);
    used[a.f] = 1;
    used[a.s] = 1;
    used[b] = 1;
    int ans = 0;
    for (int j = 1; j < 4; j++)
        ans += used[j];

    return ans;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n;
    cin >> n;

    int cnt = 0;
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            id[i][j] = cnt;
            f[cnt] = {i, j};
            cnt++;
        }
    }

    for (int i = 1; i <= n + 1; i++) {
        for (int j = 0; j < 16; j++) {
            for (int k = 0; k < 16; k++) {
                dp[i][j][k] = -1e8;
            }
        }
    }

    for (int i = 1; i <= n; i++) {
        char c;
        cin >> c;
        if (c == 'M') {
            type[i] = 1;
        }

        if (c == 'F') {
            type[i] = 2;
        }

        if (c == 'B') {
            type[i] = 3;
        }
    }

    dp[1][0][0] = 0;
    int ans = 0;

    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < 16; j++) {
            for (int k = 0; k < 16; k++) {
                pair <int, int> A = f[j], B = f[k];
                int nxt = type[i];
                maximize(dp[i + 1][id[A.s][nxt]][k], dp[i][j][k] + cal(A, nxt));
                maximize(dp[i + 1][j][id[B.s][nxt]], dp[i][j][k] + cal(B, nxt));
            }
        }
    }

    for (int i = 0; i < 16; i++) {
        for (int j = 0; j < 16; j++)
            maximize(ans, dp[n + 1][i][j]);
    }

    cout << ans << '\n';
    return 0;
}   
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...