Submission #1221498

#TimeUsernameProblemLanguageResultExecution timeMemory
1221498nibertHieroglyphs (IOI24_hieroglyphs)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;

// Check if sequence 'small' is a subsequence of 'large'
bool is_subsequence(const vector<int>& large, const vector<int>& small) {
    int j = 0;
    for (int i = 0; i < (int)large.size() && j < (int)small.size(); ++i) {
        if (large[i] == small[j]) j++;
    }
    return j == (int)small.size();
}

vector<int> ucs(vector<int> A, vector<int> B) {
    unordered_map<int, queue<int>> pos_in_B;
    for (int i = 0; i < (int)B.size(); ++i) {
        pos_in_B[B[i]].push(i);
    }

    vector<int> result;
    int last_pos = -1;
    for (int i = 0; i < (int)A.size(); ++i) {
        int val = A[i];
        if (pos_in_B.count(val)) {
            // Remove positions <= last_pos
            while (!pos_in_B[val].empty() && pos_in_B[val].front() <= last_pos) {
                pos_in_B[val].pop();
            }
            if (!pos_in_B[val].empty()) {
                last_pos = pos_in_B[val].front();
                pos_in_B[val].pop();
                result.push_back(val);
            }
        }
    }

    if (result.empty()) return {}; // empty sequence is valid UCS

    // Check if it's universal
    // Brute-force check: if there is another LCS of the same length that is NOT a subsequence of this one, return -1
    // We'll try from B's perspective now
    unordered_map<int, queue<int>> pos_in_A;
    for (int i = 0; i < (int)A.size(); ++i) {
        pos_in_A[A[i]].push(i);
    }

    vector<int> alt_result;
    last_pos = -1;
    for (int i = 0; i < (int)B.size(); ++i) {
        int val = B[i];
        if (pos_in_A.count(val)) {
            while (!pos_in_A[val].empty() && pos_in_A[val].front() <= last_pos) {
                pos_in_A[val].pop();
            }
            if (!pos_in_A[val].empty()) {
                last_pos = pos_in_A[val].front();
                pos_in_A[val].pop();
                alt_result.push_back(val);
            }
        }
    }

    if (alt_result != result && (!is_subsequence(result, alt_result) || !is_subsequence(alt_result, result))) {
        return {-1}; // multiple valid common subsequences not nested inside each other
    }

    return result;
}

int main() {
    int N, M;
    cin >> N >> M;
    vector<int> A(N), B(M);
    for (int i = 0; i < N; ++i) cin >> A[i];
    for (int i = 0; i < M; ++i) cin >> B[i];

    vector<int> ans = ucs(A, B);
    cout << ans.size() << endl;
    for (int x : ans) cout << x << " ";
    cout << endl;
    return 0;
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccfpey2e.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccFAN3Eb.o:hieroglyphs.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status