Submission #1307130

#TimeUsernameProblemLanguageResultExecution timeMemory
13071301anLongest beautiful sequence (IZhO17_subsequence)C++20
0 / 100
1 ms580 KiB
#include <bits/stdc++.h>

using namespace std;

struct state {
    int len = -1, end = -1;
};

int main () {
    int n;
    cin >> n;

    vector<int> a(n), k(n), prev(n);
    for (int i = 0; i < n; i++)
        cin >> a[i];

    for (int i = 0; i < n; i++)
        cin >> k[i];

    for (int i = 0; i < n; i++)
        prev[i] = i;

    vector<vector<int>> bc(1 << 8, vector<int>(1 << 8));
    for (int i = 0; i < (1 << 8); i++)
        for (int j = 0; j < (1 << 8); j++)
            bc[i][j] = __builtin_popcount(i & j);

    vector<state> dp1(1 << 8), dp2(1 << 8);
    dp1[a[0]] = {1, 0};

    int best_m = 1, m_idx = 0;

    for (int i = 1; i < n; i++) {
        if (dp2[a[i]].len == -1)
            dp2[a[i]] = {1, i};

        for (int mask = 0; mask < (1 << 8); mask++) {
            if (1 + dp1[mask].len > dp2[a[i]].len && bc[mask][a[i]] == k[i]) {
                dp2[a[i]] = {1 + dp1[mask].len, i};
                prev[i] = dp1[mask].end;

                if (dp2[a[i]].len > best_m) {
                    best_m = dp2[a[i]].len;
                    m_idx = i;
                }
            }

            if (dp1[mask].len > dp2[mask].len) {
                dp2[mask] = {dp1[mask].len, dp1[mask].end};
            }
        }

        swap(dp1, dp2);
        fill(dp2.begin(), dp2.end(), state(-1, -1));
    }

    printf("%d\n", best_m);

    stack<int> st;
    while (true) {
        st.push(m_idx);

        if (prev[m_idx] == m_idx)
            break;

        m_idx = prev[m_idx];
    }

    while (!st.empty()) {
        printf("%d ", st.top() + 1);
        st.pop();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...