Submission #92278

#TimeUsernameProblemLanguageResultExecution timeMemory
92278davitmargLongest beautiful sequence (IZhO17_subsequence)C++17
23 / 100
6067 ms2412 KiB
/*
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(LL x)
{
	int res=0;
	while (x)
	{
		res += x % 2;
		x /= 2;
	}
	return res;
}

int bitCount(LL a,LL b)
{
	return bitCount(a&b);
}

int n, k[100005],dp[100005],nxt[100005],mx;
LL a[100005];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i <= n; i++)
		cin >> k[i];
	dp[n] = 1;
	for (int i = n - 1; 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;
			}
	}
	for (int i = 1; i <= n; i++)
		mx = max(dp[i], mx);
	cout << mx << endl;
	for (int i = 1; i <= n; i++)
		if (dp[i] == mx)
		{
			while (i)
			{
				cout << i << " ";
				i = nxt[i];
			}
			break;
		}
	cout << endl;
	return 0;
}

/*


5
5 3 5 3 5 
10 1 20 1 20

4
1 2 3 4 
10 0 1 0

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...