This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
size_t n;
cin >> n;
vector<unsigned> a(n), k(n);
for (unsigned &x : a)
cin >> x;
for (unsigned &x : k)
cin >> x;
// dp[i][j][k] contains the last index of the LBS, where the last element has
// a first half of i, the next element has a second element of j and
// requires k bit in common with j.
vector<vector<vector<unsigned>>>
dp(1 << 10, vector<vector<unsigned>>(1 << 10, vector<unsigned>(11, UINT_MAX)));
vector<unsigned> lbs(n, 0), pre(n, UINT_MAX);
unsigned longest_end = 0;
for (size_t i = 0; i < n; i++)
{
unsigned const p = a[i] >> 10;
unsigned const q = a[i] ^ (p << 10);
size_t best_pre = UINT_MAX;
for (unsigned j = 0; j < 1 << 10U; j++)
{
unsigned req = k[i] - __builtin_popcount(p & j);
if (req < 11 && dp[j][q][req] != UINT_MAX &&
(best_pre == UINT_MAX || lbs[best_pre] < lbs[dp[j][q][req]]))
best_pre = dp[j][q][req];
}
lbs[i] = best_pre == UINT_MAX ? 1 : lbs[best_pre] + 1;
pre[i] = best_pre;
if (lbs[i] > lbs[longest_end])
longest_end = i;
for (unsigned j = 0; j < 1 << 10U; j++)
{
unsigned const c = __builtin_popcount(j & q);
if (dp[p][j][c] == UINT_MAX || lbs[i] > lbs[dp[p][j][c]])
dp[p][j][c] = i;
}
}
cout << lbs[longest_end] << '\n';
size_t i = longest_end;
vector<unsigned> seq;
while (i != UINT_MAX)
{
seq.push_back(i + 1);
i = pre[i];
}
for (auto it = seq.rbegin(); it != seq.rend(); it++)
cout << *it << ' ';
cout << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |