This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/*
DEATH-MATCH
Davit-Marg
*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <iterator>
#include <ctype.h>
#include <stdlib.h>  
#include <cassert>
#include <fstream>  
#define mod 998244353ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
using namespace std;
int bitCount(int n)
{
	int res = 0;
	while (n)
	{
		if (n & 1)
			res++;
		n >>= 1;
	}
	return res;
}
int bitCount(int a, int b)
{
	return bitCount( (a&b) );
}
int n, a[100005], k[100005],dp[100005],nxt[100005],last[(1<<20)+10],mx;
vector<int> ans;
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		mx = max(mx,a[i]);
	}
	for (int i = 1; i <= n; i++)
		cin >> k[i];
	if (n<=5000 && 0)
	{
		for (int i = n; i >= 1; i--)
		{
			dp[i] = 1;
			for (int j = i + 1; j <= n; j++)
				if (bitCount(a[i], a[j]) == k[j] && dp[i] < 1 + dp[j])
				{
					dp[i] = 1 + dp[j];
					nxt[i] = j;
				}
		}
		mx = 0;
		for (int i = 1; i <= n; i++)
			mx = max(dp[i], mx);
		for (int i = 1; i <= n; i++)
			if (dp[i] == mx)
			{
				while (i)
				{
					ans.PB(i);
					i = nxt[i];
				}
				break;
			}
	}
	else
	{
		for (int i = 1; i <= n; i++)
		{
			dp[i] = 1;
			for (int j = 0; j <= (1 << 8); j++)
			{
				for (int p = 1; p < i; p++)
					if (a[p]==j != 0 && bitCount(a[i], a[p]) == k[i] && dp[i] <= 1 + dp[p])
					{
						dp[i] = 1 + dp[p];
						nxt[i] = p;
					}
			}
			last[a[i]] = i;
		}
		mx = 0;
		for (int i = 1; i <= n; i++)
			mx = max(dp[i], mx);
		for (int i = 1; i <= n; i++)
			if (dp[i] == mx)
			{
				while (i)
				{
					ans.PB(i);
					i = nxt[i];
				}
				break;
			}
	}
	cout << ans.size() << endl;
	sort(ans.begin(), ans.end());
	for (int i = 0; i < ans.size(); i++)
		cout << ans[i] << " ";
	cout << endl;
	return 0;
}
/*
11 
5 5 13 17 7 17 5 5 1 5 5
2 2 2  1  2  2 1 1 1 1 2
7
5 5 13 17 7 17 5 
2 2 2  1  2  1 1 
2
8 9
20 0
5
5 3 5 3 5 
10 1 20 1 20
4
1 2 3 4 
10 0 1 0
*/
Compilation message (stderr)
subsequence.cpp: In function 'int main()':
subsequence.cpp:96:14: warning: suggest parentheses around comparison in operand of '!=' [-Wparentheses]
      if (a[p]==j != 0 && bitCount(a[i], a[p]) == k[i] && dp[i] <= 1 + dp[p])
          ~~~~^~~
subsequence.cpp:122:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < ans.size(); 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... |