提交时间:2024-11-05 17:40:18
运行 ID: 34284
#include<iostream> #include<algorithm> using namespace std; const int N=300100; inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } int n,a[N],b[N],d[N]; int dsu[N]; inline int get_rnk(int x){return lower_bound(d,d+n+1,x)-d;} int find(int x){return dsu[x]==x?x:dsu[x]=find(dsu[x]);} void init(){ cin>>n; for(int i=1;i<=n;i++)a[i]=read(),a[0]^=a[i]; for(int i=1;i<=n;i++)b[i]=read(),b[0]^=b[i]; for(int i=0;i<=n;i++)d[i]=a[i]; sort(d,d+n+1); for(int i=0;i<=n;i++)a[i]=get_rnk(a[i]); for(int i=0;i<=n;i++)b[i]=get_rnk(b[i]); for(int i=0;i<=n;i++)dsu[i]=i; } // namespace SUB1{ // const int M=11; // bool tag[1<<M]; // void solve(){ // int m=0; // for(int i=1;i<=n;i++)if(a[i]!=b[i]){ // a[++m]=a[i]; // b[m]=b[i]; // } // n=m; // n++; // for(int i=0;i<(1<<n);i++){ // } // } // } namespace SUB2{ int ans=0; bool vis[N]; inline int count(int x){ int res=0; while(!vis[x]){ res++; vis[x]=true; x=b[x]; } return res; } void solve(){ if(b[0])ans=count(0)-1; for(int i=0;i<=n;i++)if(b[i]!=i&&!vis[i])ans+=count(i)+1; cout<<ans; } } inline int lowbit(int x){return x&-x;} int ans; bool vis[N]; int main(){ // freopen("xor.in","r",stdin); // freopen("xor.out","w",stdout); init(); // for(int i=0;i<=n;i++)cout<<a[i]<<' ';cout<<endl; // for(int i=0;i<=n;i++)cout<<b[i]<<' ';cout<<endl; // if(n<=10){SUB1::solve();return 0;} bool sub2=true; if(n+1!=lowbit(n+1))sub2=false; for(int i=0;i<=n;i++)if(a[i]!=i)sub2=false; if(sub2){SUB2::solve();return 0;} int m=0; for(int i=1;i<=n;i++)if(a[i]!=b[i]){ a[++m]=a[i]; b[m]=b[i]; } n=m; for(int i=0;i<=n;i++)dsu[find(a[i])]=find(b[i]); vis[find(a[0])]=true; for(int i=1;i<=n;i++)if(!vis[find(a[i])])ans++,vis[find(a[i])]=true; ans+=n; cout<<ans; return 0; }