• 【codeforces 742B】Arpa’s obvious problem and Mehrdad’s terrible solution


    time limit per test1 second
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output
    There are some beautiful girls in Arpa’s land as mentioned before.

    Once Arpa came up with an obvious problem:

    Given an array and a number x, count the number of pairs of indices i, j (1 ≤ i < j ≤ n) such that , where is bitwise xor operation (see notes for explanation).

    Immediately, Mehrdad discovered a terrible solution that nobody trusted. Now Arpa needs your help to implement the solution to that problem.

    Input
    First line contains two integers n and x (1 ≤ n ≤ 105, 0 ≤ x ≤ 105) — the number of elements in the array and the integer x.

    Second line contains n integers a1, a2, …, an (1 ≤ ai ≤ 105) — the elements of the array.

    Output
    Print a single integer: the answer to the problem.

    Examples
    input
    2 3
    1 2
    output
    1
    input
    6 1
    5 1 2 3 4 1
    output
    2
    Note
    In the first sample there is only one pair of i = 1 and j = 2. so the answer is 1.

    In the second sample the only two pairs are i = 3, j = 4 (since ) and i = 1, j = 5 (since ).

    A bitwise xor takes two bit integers of equal length and performs the logical xor operation on each pair of corresponding bits. The result in each position is 1 if only the first bit is 1 or only the second bit is 1, but will be 0 if both are 0 or both are 1. You can read more about bitwise xor operation here: https://en.wikipedia.org/wiki/Bitwise_operation#XOR.

    【题目链接】:http://codeforces.com/contest/742/problem/B

    【题解】

    用个map记录1..i-1里面x xor a[i]的值有多少个;
    则那些数字都能和a[i]进行xor运算取得a[i];
    因为 a xor b = c
    则c xor b = a
    且c xor a = b;
    O(n)枚举搞一下就好;

    【完整代码】

    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <set>
    #include <map>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <stack>
    #include <string>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    void rel(LL &r)
    {
        r = 0;
        char t = getchar();
        while (!isdigit(t) && t!='-') t = getchar();
        LL sign = 1;
        if (t == '-')sign = -1;
        while (!isdigit(t)) t = getchar();
        while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
        r = r*sign;
    }
    
    void rei(int &r)
    {
        r = 0;
        char t = getchar();
        while (!isdigit(t)&&t!='-') t = getchar();
        int sign = 1;
        if (t == '-')sign = -1;
        while (!isdigit(t)) t = getchar();
        while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
        r = r*sign;
    }
    
    const int MAXN = 1e5+100;
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    
    int n,x;
    int a[MAXN];
    map <int,int> dic;
    
    int main()
    {
       // freopen("F:\rush.txt","r",stdin);
        scanf("%d%d",&n,&x);
        rep1(i,1,n)
            scanf("%d",&a[i]);
        LL ans = 0;
        rep1(i,1,n)
        {
            if (dic[a[i]^x])
                ans+=dic[a[i]^x];
            dic[a[i]]++;
        }
        cout << ans << endl;
        return 0;
    }
  • 相关阅读:
    The Balance POJ 2142 扩展欧几里得
    扩展欧几里得定理总结
    Crashing Robots POJ 2632 简单模拟
    POJ 1328 Radar Installation 贪心算法
    The Pilots Brothers' refrigerator DFS+枚举
    HDU RSA 扩展欧几里得
    HDU A/B 扩展欧几里得
    ACM 数学
    E
    BZOJ 3223: Tyvj 1729 文艺平衡树
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626858.html
Copyright © 2020-2023  润新知