题解 CF1362B 【Johnny and His Hobbies】

更佳的阅读效果。

description:

给出 $n$ 个数字,让找出最小的正整数 $k$,使得这 $n$ 个数字异或 $k$ 之后,还是这 $n$ 个数字。(顺序不一定要相同

solution:

观察到数据范围并不大,故直接枚举 $k$ 从 $1\sim 1024$,可以在输入的时候就预处理出来每一种异或结果然后分别排序。

code:

#include<cstdio>
#include<algorithm>
using namespace std;
int b[1030][1030],a[1030];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            for(int j=1;j<=1024;j++)
            {
                b[j][i]=a[i]^j;
            }
        }
        for(int i=1;i<=1024;i++)
        {
            sort(b[i]+1,b[i]+n+1);
        }
        sort(a+1,a+n+1);
        int tag=0;
        for(int i=1;i<=1024;i++)
        {
            int flag=0;
            for(int j=1;j<=n;j++)
            {
                if(b[i][j]!=a[j])
                {
                    flag=1;
                    break;
                }
            }
            if(flag==0)
            {
                printf("%d\n",i);
                tag=1;
                break;
            }
        }
        if(tag==0)printf("-1\n");
    }
    return 0;
} 

发表于 2020-06-11 20:20:52 in 题解