概述
XOR Replace
Problem Statement
分别给出两个长度为
n
的数组
2
≤
0
≤
Solution
不难发现操作的实质是把某个数变成整个序列的异或和,接着这个序列的异或和就变成了被换掉的那个数。
我们把整个序列的异或和放在第
n
+
我们考虑如果某个位置上的
Code
#include<bits/stdc++.h>
#define fo(i,j,l) for(int i=j;i<=l;++i)
#define fd(i,j,l) for(int i=j;i>=l;--i)
using namespace std;
typedef long long ll;
const ll N=11e4;
map<int,int> cha;
int n,m,j,k,l,i,o;
int fa[N],a[N],b[N],aa[N],bb[N],done[N];
inline int gf(int o)
{return fa[o]==o?o:fa[o]=gf(fa[o]);}
int main()
{
cin>>n;
fo(i,1,n)scanf("%d",&a[i]),a[n+1]^=a[i],aa[i]=a[i];
fo(i,1,n)scanf("%d",&b[i]),b[n+1]^=b[i],bb[i]=b[i];
++n; aa[n]=a[n]; bb[n]=b[n];
sort(aa+1,aa+n+1); sort(bb+1,bb+n+1);
fo(i,1,n)if(aa[i]!=bb[i]){
puts("-1"); return 0;
}
int t=0; aa[0]=bb[0]=-1;
fo(i,1,n)t+=(aa[i]!=aa[i-1]),cha[aa[i]]=t;
fo(i,1,t)fa[i]=i;
int ans=-1;
fo(i,1,n)if(i==n||a[i]!=b[i]){
ans+=(i<n);
int x=cha[a[i]],y=cha[b[i]];
fa[gf(x)]=gf(y);
done[x]=done[y]=1;
}
fo(i,1,n)if(gf(i)==i&&done[i])++ans;
cout<<(ans<0?0:ans);
}
最后
以上就是苗条电话为你收集整理的Atcoder Grand Contest 016 D XOR Replace的全部内容,希望文章能够帮你解决Atcoder Grand Contest 016 D XOR Replace所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复