hihocoder #1509 : 异或排序
很有意思的题 中文
一开始拿到这个题没头绪
2^60的话 考虑相邻2个数
a 0 1 0 1 0 0
b 0 0 1 0 0 0 0
他们最高位不相同的 相同的异或同一个数还是相同所以考虑这位 0 1 那么s这位一定要是 0 , 0 1 就相反 然后都不能矛盾 这样就解决了
#include<cstdio> #include<cstring> #include<map> #include<iostream> #include<algorithm> #include<math.h> #include<map> #include<queue> #include<vector> using namespace std; #define inf 1000000007 #define ll long long #define MAXN 1010 ll z[MAXN]; int d[MAXN][80]; int p[MAXN]; int main() { int n; while(scanf("%d",&n)!=EOF) { memset(d,0,sizeof(d)); memset(p,-1,sizeof(p)); for(int i=1;i<=n;i++) scanf("%lld",&z[i]); for(int i=1;i<=n;i++) { for(int j=0;j<=59;j++) { d[i][j]=(z[i]&((ll)1<<j)); } } int ok=0; for(int i=2;i<=n;i++) { for(int j=59;j>=0;j--) { if(d[i][j]!=d[i-1][j]) { if(d[i][j]==0&&d[i-1][j]==1) { if(p[j]==-1) { p[j]=1; } else if(p[j]==0) ok=1; } else { if(p[j]==-1) { p[j]=0; } else if(p[j]==1) ok=1; } break; } } } ll ans; if(ok==1) ans=0; else { int cnt=0; for(int i=0;i<60;i++) if(p[i]==-1) cnt++; ans=(ll)1<<cnt; } cout<<ans<<endl; } return 0; }
posted on 2017-11-06 16:53 HelloWorld!--By-MJY 阅读(88) 评论(0) 编辑 收藏 举报