我是靠谱客的博主 搞怪泥猴桃,最近开发中收集的这篇文章主要介绍AtCoder Grand Contest 016 D - XOR ReplaceProblem StatementConstraintsInputOutputGistSolutionCode,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Time limit : 2sec / Memory limit : 256MB

Score : 1000 points

Problem Statement

There is a sequence of length N: a=(a1,a2,…,aN). Here, each ai is a non-negative integer.

Snuke can repeatedly perform the following operation:

Let the XOR of all the elements in a be x. Select an integer i (1≤i≤N) and replace ai with x.
Snuke’s objective is to match a with another sequence b=(b1,b2,…,bN). Here, each bi is a non-negative integer.

Determine whether the objective is achievable, and find the minimum necessary number of operations if the answer is positive.

Constraints

2≤N≤105
ai and bi are integers.
0≤ai,bi<230

Input

Input is given from Standard Input in the following format:

N
a1 a2 … aN
b1 b2 … bN

Output

If the objective is achievable, print the minimum necessary number of operations. Otherwise, print -1 instead.

Sample Input 1

3
0 1 2
3 1 0

Sample Output 1

2
At first, the XOR of all the elements of a is 3. If we replace a1 with 3, a becomes (3,1,2).

Now, the XOR of all the elements of a is 0. If we replace a3 with 0, a becomes (3,1,0), which matches b.

Sample Input 2

Copy
3
0 1 2
0 1 2

Sample Output 2

0

Sample Input 3

2
1 1
0 0

Sample Output 3

-1

Sample Input 4

4
0 1 2 3
1 0 3 2

Sample Output 4

5

Gist

  • 给你两个序列 a 和序列 b ,长度各为 N

  • 要求最少的变换操作数,使得将序列 a 变为序列 b

  • 操作:令 x=序列 a 每个元素的异或和,并用 x 代替一个 ai

  • 数据范围: 2N105 0ai,bi<230

Solution

  • 要会做这题,就必须发现其操作的本质。

  • 发现除了第一次求异或和产生的数是新数外,之后的数都是旧的(替换的)。

  • 因为替换后的异或和就是被替换的数本身(异或的性质)。

  • 那么为了方便处理,就将第一次的新数放到那 N 个数的末尾,

  • 操作就相当于将最后一个数与前面 N 个数中的某个数交换。

  • 不合法的情况就是将两列数排序后不完全相同(无论如何都不能换到相同)。

  • 之后某个位置上 a 要换成 b ,就 a b 连一条边,

  • 每个连通块就需要 Size+1 次交换操作(除非包含第 N+1 个数,可以少一次,即答案减一)。

  • 用一个并查集维护即可,注意存数判断时要用 Hash 表。

  • 时间复杂度 O(N log N)

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=1e5+5,M=N*100+7;
int tot,ans;
int a[N],b[N],a1[N],b1[N];
int f[N],bel[M],h[M];
inline int read()
{
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
inline int get(int x)
{
    return f[x]==x?x:f[x]=get(f[x]);
}
inline int hash(int x)
{
    int y=x%M;
    while(h[y]>=0 && h[y]!=x) y=(y+1)%M;
    return y;
}
int main()
{
    int n=read();
    for(int i=1;i<=n;i++)
    {
        a[i]=a1[i]=read();
        a[n+1]^=a[i];
    }
    a1[n+1]=a[n+1];
    for(int i=1;i<=n;i++)
    {
        b[i]=b1[i]=read();
        b[n+1]^=b[i];
    }
    b1[n+1]=b[n+1],n++;
    sort(a1+1,a1+1+n);
    sort(b1+1,b1+1+n);
    for(int i=1;i<=n;i++)
        if(a1[i]^b1[i]) return 0&printf("-1");
    memset(h,-1,sizeof(h));
    for(int i=1;i<=n;i++)
        if(i==n || a[i]^b[i])
        {
            if(i<n) ans++;
            int k=hash(a[i]);
            if(h[k]<0) h[k]=a[i],bel[k]=++tot;
            k=hash(b[i]);
            if(h[k]<0) h[k]=b[i],bel[k]=++tot;
        }
    for(int i=1;i<=tot;i++) f[i]=i;
    for(int i=1;i<=n;i++)
        if(a[i]^b[i]) f[get(bel[hash(a[i])])]=get(bel[hash(b[i])]);
    for(int i=1;i<=tot;i++)
        if(f[i]==i) ans++;
    printf("%d",ans-1);
    return 0;
}

最后

以上就是搞怪泥猴桃为你收集整理的AtCoder Grand Contest 016 D - XOR ReplaceProblem StatementConstraintsInputOutputGistSolutionCode的全部内容,希望文章能够帮你解决AtCoder Grand Contest 016 D - XOR ReplaceProblem StatementConstraintsInputOutputGistSolutionCode所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部