愤怒
考场想到正解
然后觉得我的“正解”和正解差不多 一样的效果
被忽略的与正解的不同也想到了
然而 我懒得再写
于是快乐10分
气坏了
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<map> #define rint register int using std::sort; using std::map; //using std::cout; //using std::endl; template <class T>inline void read(T &X) { X=0;int W=0;char ch=0; while(!isdigit(ch))W|=ch=='-',ch=getchar(); while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); X=W?-X:X;return; } int n,cnt=0,ans=0; long long sta[100010],end[100010],xors=0,xore=0,sta2[100010],end2[100010],fa[100010]; bool boo(true); long long find(long long x){return fa[x]==x?x:fa[x]=find(fa[x]);} map<int,int>num; int main() { // freopen("duliu.in","r",stdin); // freopen("duliu.out","w",stdout); read(n); for(rint i=1;i<=n;++i) read(sta[i]),sta2[i]=sta[i],xors^=sta[i]; sta[n+1]=xors;sta2[n+1]=xors; for(rint i=1;i<=n;++i) { read(end[i]),end2[i]=end[i]; xore^=end[i]; if(xors==end[i])boo=false; } end[n+1]=xore;end2[n+1]=xore; ++n; sort(sta2+1,sta2+n+1); sort(end2+1,end2+n+1); for(rint i=1;i<=n;++i) { if(sta2[i]!=end2[i]){printf("-1 ");return 0;} } cnt=0; for (int i=1;i<=n;i++) { if (sta[i]!=end[i]||i==n) { if (i<n) ans++; if (!num[sta[i]]) cnt++,num[sta[i]]=cnt; if (!num[end[i]]) cnt++,num[end[i]]=cnt; } } if (ans==0) { printf("0 "); return 0; } for (int i=1;i<=cnt;i++) fa[i]=i; for (int i=1;i<=n;i++) if (sta[i]!=end[i]) fa[find(num[sta[i]])]=find(num[end[i]]); for (int i=1;i<=cnt;i++) if (fa[i]==i) ans++; printf("%d ",ans-1); return 0; }