3.31 每日一题题解

Arpa’s obvious problem and Mehrdad’s terrible solution

涉及知识点:

  • 数学

solution:

  • 题意就是让你找出给定数列里两两异或值为x的组合个数
  • 暴力n方,会超时
  • 根据异或运算性质:a^b=x; x^a=b; x^b=a;
  • 所以可以直接O(n)的遍历每一个数,查找x异或这个数是否存在即可

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6 + 10;
int a[maxn],sum[maxn];
int main()
{
    int n,x,y,z;
    ll ans = 0;
    cin>>n>>x;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++){
        z = x^a[i];
        if(sum[z])
            ans += 1ll*sum[z];
        sum[a[i]]++;
    }
    cout<<ans<<endl;
    return 0;
}
posted @ 2020-03-31 10:08  QFNU-ACM  阅读(112)  评论(0编辑  收藏  举报