• 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;
    }
    

      

  • 相关阅读:
    SpringMvc
    Spring-Aop
    Spring-IOC
    Spring模块划分
    队列
    稀疏数组
    数据结构
    Nginx配置实例
    Nginx常用命令
    视频断点播放:h5+jquery
  • 原文地址:https://www.cnblogs.com/JYYHH/p/9564722.html
Copyright © 2020-2023  润新知