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;
}
View Code

 

原文地址:https://www.cnblogs.com/cherryMJY/p/7793997.html