This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//
//  main1.cpp
//  problem1
//
//  Created by Mohammad Bashkail on 20/10/1445 AH.
//
 
#include <bits/stdc++.h>
 
using namespace std;
#define endl '\n'
using ll = long long;
#define pb push_back
#define pF first
#define pS second
#define SP <<" "<<
vector<bitset<21>> a;
ll a1[112345], k[112345], dp[112345], par[112345];
pair<ll,ll> m[3000];
 
int main() {
    ios::sync_with_stdio(0);cout.tie(0); cin.tie(0);
    ll n;
    cin>>n;
    if (n <= 5000) {
        for (int i=0; i<n; i++) {
            ll x;
            cin>>x;
            bitset<21> b(x);
            a.pb(b);
        }
        for (int i=0; i<n; i++) cin>>k[i];
        
        fill(dp, dp+n, 1);
        fill(par, par+n, -1);
        for (int i=0; i<n; i++) {
            for (int j=i-1; j>=0; j--) {
                bitset<21> b(a[i] & a[j]);
                if (b.count() == k[i]) {
                    if (dp[j]+1 > dp[i]) {
                        par[i] = j;
                        dp[i] = dp[j]+1;
                    }
                }
            }
        }
        pair<ll,ll> mx = {-1, 0};
        for (int i=0; i<n; i++) {
            if (dp[i] > mx.pF) {
                mx = {dp[i], i};
            }
        }
        cout << mx.pF << endl;
        ll i = mx.pS;
        vector<ll> ans;
        while(i != -1) {
            ans.pb(i);
            i = par[i];
        }
        reverse(ans.begin(), ans.end());
        for (ll i : ans) cout << i+1 << " ";
    }
    else {
        for (int i=0; i<n; i++) {
                ll x;
                cin>>x;
                bitset<21> b(x);
                a.pb(b);
                a1[i] = x;
            }
            for (int i=0; i<n; i++) cin>>k[i];
            for (int i=0; i<500; i++) m[i] = {-1, -1};
            fill(dp, dp+n, 1);
            fill(par, par+n, -1);
            
            for (int i=0; i<n; i++) {
                for (int j=0; j<500; j++) {
                    bitset<21> b1(j);
                    bitset<21> b(a[i] & b1);
                    if (ll(b.count()) == k[i]) {
                        if (m[j].pF+1 > dp[i]) {
                            par[i] = m[j].pS;
                            dp[i] = m[j].pF+1;
                        }
                    }
                }
                if (dp[i] > m[a1[i]].pF) {
                    m[a1[i]] = {dp[i], i};
                }
            }
         
            pair<ll,ll> mx = {-1, 0};
            for (int i=0; i<n; i++) {
                if (dp[i] > mx.pF) {
                    mx = {dp[i], i};
                }
            }
            cout << mx.pF << endl;
            ll i = mx.pS;
            vector<ll> ans;
            while(i != -1) {
                ans.pb(i);
                i = par[i];
            }
            reverse(ans.begin(), ans.end());
            for (ll i : ans) cout << i+1 << " ";
    }
}
Compilation message (stderr)
subsequence.cpp: In function 'int main()':
subsequence.cpp:39:31: warning: comparison of integer expressions of different signedness: 'std::size_t' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   39 |                 if (b.count() == k[i]) {
      |                     ~~~~~~~~~~^~~~~~~| # | 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... |