异或

题目描述
给定整数m以及n各数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个。
输入描述:
第一行包含两个整数n,m.

第二行给出n个整数A1,A2,…,An。

数据范围

对于30%的数据,1 <= n, m <= 1000

对于100%的数据,1 <= n, m, Ai <= 10^5
输出描述:
输出仅包括一行,即所求的答案
示例1
输入

3 10
6 5 10
输出

2


//非递归,因为用的数组;
#include

using namespace std;

int n,m,a[100001];
long long cnt=0;
int c[(1<<18)+1]={0};
int maxDepth=16;

void buildtrie()
{
    for(int i=0;iint now=1;
        for(int j=maxDepth;j>=0;--j)
        {
            now=(now<<1)+((a[i]&(1<0?1:0);
            c[now]++;
        }
    }
}

int countTrie(int p,int j)
{
    int now=1;
    for(int i=maxDepth;i>=j;--i)
    {
        now=(now<<1)+((p&(1<0?1:0);
    }
    return c[now];
}

int caltrie(int p)
{
    int count=0;
    int nowbit=0;
    for(int j=maxDepth;j>=0;--j)
    {
        int bit=(1<int k=bit&m;
        nowbit|=k;
        if(k==0)
        {
            count+=countTrie((nowbit|bit)^p,j);
        }
    }
    return count;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;iscanf("%d",&a[i]);
    }
    buildtrie();
    for(int i=0;icout<2;
    return 0;
}

//涉及递归
#include

using namespace std;

int n,m;
int array[100001];

struct TrieTree
{
    int count;
    struct TrieTree *next[2]{NULL,NULL};
    TrieTree():count(1){}
};

TrieTree* buildTrieTree(int a[])
{
    TrieTree* trieTree=new TrieTree();
    for(int i=0;ifor(int j=16;j>=0;--j)
        {
            int digit=(a[i]>>j)&1;
            if(cur->next[digit]){
                ++cur->next[digit]->count;
            }
            else{
                cur->next[digit]=new TrieTree;
            }
            cur=cur->next[digit];
        }
    }
    return trieTree;
}
long long queryTrieTree(TrieTree *trieTree,int a,int index)
{
    if(trieTree==NULL)
        return 0;
    TrieTree* cur = trieTree;
    for(int i=index;i>=0;--i)
    {
        int aDigit = (a >> i) & 1;
        int mDigit = (m >> i) & 1;
        if(1==aDigit && 1==mDigit)
        {
            if(NULL == cur->next[0])
                return 0;
            cur = cur->next[0];
        }
        else if(0 == aDigit && 1==mDigit)
        {
            if(NULL == cur->next[1])
                return 0;
            cur = cur->next[1];
        }
        else if(1 == aDigit && 0 == mDigit)
        {
            long long val0 =  (NULL == cur->next[0]) ? 0 : cur->next[0]->count;
            long long val1 =  queryTrieTree(cur->next[1],a,i-1);
            return val0+val1;
        }
        else if(0 == aDigit && 0 == mDigit)
        {
            long long val0 =  queryTrieTree(cur->next[0],a,i-1);
            long long val1 =  (NULL == cur->next[1]) ? 0 : cur->next[1]->count;
            return val0+val1;
        }
    }
    return 0;
}

long long solve(int array[],int m)
{
    TrieTree *trieTree=buildTrieTree(array);
    long long result=0;
    for(int i=0;iarray[i],16);
    }
    return result/2;
}

int main()
{
    cin>>n>>m;
    for(int i=0;icin>>array[i];
    cout<array,m);
    return 0;
}

你可能感兴趣的:(题目类——2017校招真题)