刷题记录表

No.3

2020-04-01

【题目】AGC016D XOR Replace

【思路】

省略……

【代码】

#include<bits/stdc++.h>
using namespace std;
inline int read(int &a){a=0;int f=1;char c=getchar();if(c==EOF) return a=EOF;
for(;c<'0' || c>'9';c=getchar()){if(c=='-') f=-1;if(c==EOF) return a=EOF;}
for(;c<='9' && c>='0';a=a*10+c-'0',c=getchar());return a*=f;}
inline void print(int a){int s[20],t=0;if(!a){putchar('0');putchar('\n');return;}
if(a<0) a=-a,putchar('-');while(a){s[t++]=a%10,a/=10;}
for(;t--;putchar(s[t]+'0'));putchar('\n');}
map<int,int> f;
int a[100010],b[100010];
int c[100010],d[100010];
int fa[200010];
int n,tot=0,ans=0;
int reg(int x){
    return fa[x]==x?x:fa[x]=reg(fa[x]);
}

int main()
{
	freopen("xor.in","r",stdin);
	freopen("xor.out","w",stdout);
	read(n);
	int sa=0,sb=0;
	for(int i=1;i<=n;i++) read(a[i]),sa^=a[i],c[i]=a[i];
	for(int i=1;i<=n;i++) read(b[i]),sb^=b[i],d[i]=b[i];
	n++;
	c[n]=a[n]=sa;
	d[n]=b[n]=sb;
	sort(c+1,c+n+1);
	sort(d+1,d+n+1);
	int i;
	for(i=1;i<=n+1 && !(i>n || c[i]!=d[i]);i++);
	if(i<=n)
	{
		puts("-1");
		return 0;
	}
	for(int i=1;i<=n;i++)
	if(a[i]!=b[i] || i==n)
	{
		if(i<n) ans++;
		if(!f[a[i]]) f[a[i]]=++tot;
		if(!f[b[i]]) f[b[i]]=++tot;
	}
	if(!ans)
	{
		puts("0");
		return 0;
	}
	for(int i=1;i<=tot;i++) fa[i]=i;
	for(int i=1;i<=n;i++)
	if(a[i]!=b[i]) fa[reg(f[a[i]])]=reg(f[b[i]]);
	for(int i=1;i<=tot;i++)
	if(fa[i]==i) ans++;
	printf("%d\n",ans-1);
	return 0;
}

留下评论

通过 WordPress.com 设计一个这样的站点
从这里开始