#include <bits/stdc++.h>
using namespace std; 
using ll = long long; 
const int N = 1e5 + 5;
int n, a[N], k[N], dp[N], trace[N], luu[1025][1025][22], base = 1024;
int main() { 
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
	cin >> n;
	for(int i=1;i<=n;++i) cin >> a[i];
	for(int i=1;i<=n;++i) cin >> k[i];
	for(int i=1;i<=n;++i) {
		dp[i] = 1;
		int mask2 = a[i] % base;
		int mask1 = (a[i] - mask2) / base;
		for(int mask=0;mask<base;++mask) {
			int K = __builtin_popcount(mask & mask1);
			K = luu[mask][mask2][k[i] - K];
			if(dp[K] + 1 > dp[i]) dp[i] = dp[K] + 1, trace[i] = K;
		}
		for(int mask=0;mask<base;++mask) {
			int id = __builtin_popcount(mask & mask2);
			if(dp[luu[mask1][mask][id]] < dp[i]) 
				luu[mask1][mask][id] = i;
		}
	}
	int cur = 0;
	for(int i=1;i<=n;++i) if(dp[i] > dp[cur]) cur = i;
	cout << dp[cur] << '\n';
	vector <int> ans;
	while(cur != 0) {
		ans.push_back(cur);
		cur = trace[cur];
	}
	reverse(ans.begin(), ans.end());
	for(int x : ans) cout << x << ' ';
 	return 0;
}
| # | 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... |