hihocoder 1509 异或排序

题面在这里!

    考虑前后两个数 x,y,可以发现S只有在(x xor y)的最高有1位上的取值是要被确定的 (如果x==y那么没有限制),可以推一下什么情况下是1/0。

    于是我们模拟一下这个操作,判一判限制有没有矛盾,如果没有矛盾答案就是 2^自由位

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int n,ban[67];
ll now,pre,Xor,c[67],ans=1;

int main(){
	scanf("%d",&n),fill(ban,ban+60,-1);
	c[0]=1; for(int i=1;i<=60;i++) c[i]=c[i-1]+c[i-1];
	
	for(int i=1;i<=n;pre=now,i++){
		scanf("%lld",&now);
		
		if(!pre) continue;
		
		for(int j=59;j>=0;j--) if((now&c[j])^(pre&c[j])){
			if(now&c[j]){
				if(ban[j]==1){ puts("0"); return 0;}
				ban[j]=0;
			}
			else{
				if(ban[j]==0){ puts("0"); return 0;}
				ban[j]=1;					
			}
			break;
		}
	}
	
	for(int i=0;i<60;i++) if(ban[i]==-1) ans*=2ll;
	
	cout<<ans<<endl;
	return 0;
}

  

原文地址:https://www.cnblogs.com/JYYHH/p/9564722.html