天天看點

子集(異或)

子集(異或)

這個題的限制條件也就是集合中最高位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;     }           
上一篇: 異或圖
下一篇: 異或運算