CodeForces - 165E Compatible Numbers(状压DP+二进制运算)

https://vjudge.net/contest/369905#problem/A
题意:给n个数字,求每一个数字在这n个数里的可以和(&)为0的数
解题思路:
二进制1001对应的和为0的二进数有 0xx0,xx可以为0也可以为1
利用这一点先把每个数在inf内所有和为0的数都标记 出来,然后寻找有没有这n个数中的一个存在
11111111…与任何值异或都得到的是任何值的个数位逆过来

#include<iostream>
#include<cstdio>
using namespace std;
const int inf=(1<<22)-1;
const int len=22;
int m;
int a[1100000];
int dp[inf+10];
int main()
{
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&a[i]);
		dp[inf^a[i]]=a[i];
	}
	for(int i=inf;i>=0;i--)
	{
		if(!dp[i])
		{
			for(int j=0;j<len;j++)
			{
				if(dp[i|(1<<j)])
					dp[i]=dp[i|(1<<j)];
			}
		}
	}
	for(int i=1;i<=m;i++)
	{
		if(dp[a[i]])
		{
			printf("%d ",dp[a[i]]);
		}
		else
			printf("-1 ");
	}
	printf("\n");
	return 0;
}

原创文章 65 获赞 3 访问量 2087

猜你喜欢

转载自blog.csdn.net/littlegoldgold/article/details/105764137