子集(异或)


这个题的限制条件也就是集合中最高位1的位置都一样。所以我们可以考虑桶排(因为在int范围内,所以最多开31个就可以了)。

我没有开桶,就是先排序,然后二分查找+位运算判断相同位最高位为1的情况。

以下是代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 1010
using namespace std;
int n;
int a[MAXN];              
inline int maxx(int x)
{
	for(int i=30;i>=0;i--)
		if(x&(1<<i))
			return i;
	return 0;
}
inline bool check(int now,int to)
{
	if(maxx(to)>maxx(now)) return false;
	else return true;
}
int main()
{        
	freopen("subset.in","r",stdin);
	freopen("subset.out","w",stdout);
	while(scanf("%d",&n)!=EOF)
	{
		int ans=0;
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		sort(a+1,a+1+n);
		for(int i=1;i<=n;i++)
		{
			int l=i,r=n;
			while(l<=r)
			{
				int mid=(l+r)>>1;
				if(check(a[i],a[mid])) l=mid+1;
					else r=mid-1;
			}
			ans=max(ans,l-i);
		}
		printf("%d\n",ans);
	}
	return 0;
}
posted @ 2018-10-14 16:11  风浔凌  阅读(420)  评论(0编辑  收藏  举报