2806: 【例45.2】 筷子大作战

内存限制:64 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:28 解决:16

题目描述

有个粗心的同学。今天在食堂打翻了洗碗大伯的篮子,筷子落了一地。
结果大伯怒了,硬是要这位同学把筷子一对一对配回去。
每只筷子都是有长度的,长度一样的筷子才算是一对。不过洗碗大伯跟他说其中有一只筷子是落单的。你能帮这位粗心的同学找出落单的筷子的长度吗?

输入

第一行为一个正整数 $N$,代表筷子的支数($1≤N≤5000000$)。
接下去一行有 $N$ 个正整数,代表每只筷子的长度 $L_i$($1≤L_i≤2147483647$),可能有很多筷子的长度都是一样的。

输出

输出落单的筷子的长度。

样例输入 复制

5
1 2 1 2 3

样例输出 复制

3

提示

异或性质:

1.交换律:对于任意两个值 a 和 b,都有 a ^ b == b ^ a。即异或运算满足交换律。
2.结合律:对于任意三个值 a、b 和 c,都有 (a ^ b) ^ c == a ^ (b ^ c)。即异或运算满足结合律。
3.自反性:对于任意值 a,都有 a ^ a == 0。即一个值与自己进行异或运算结果为0。
4.零值:对于任意值 a,都有 a ^ 0 == a。即一个值与0进行异或运算结果为其本身。

两个相同的数异或起来等于0 ,0异或任何数都会等于这个数。由于筷子只有一支不是成双的,因此所有成双的筷子长度异或在一起后一定等于0,再异或那支落单的筷子长度最终结果就为落单筷子的长度。
#include<bits/stdc++.h>
using namespace std;
long long n,x,ans;
int main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x;
        ans^=x;
    }
    cout<<ans;
    return 0;
} 

#include<bits/stdc++.h>
using namespace std;
long long n,x,ans;
int main(){
    scanf("%ld",&n);
    for(int i=1;i<=n;i++){
        scanf("%ld",&x);
        ans^=x;
    }
    printf("%ld",ans);
    return 0;
}