#include<bits/stdc++.h>

using namespace std;

#define N 300000

int n,m,S,T,tot,ans,q[N],head[N],iter[N],a[N],b[N],visa[N],visb[N],lvl[N];
struct edge{int v,r,c,nxt;}e[N<<3];

void add(int x,int y,int z){
	e[++tot].v=y; e[tot].r=tot+1; e[tot].c=z; e[tot].nxt=head[x]; head[x]=tot;
	e[++tot].v=x; e[tot].r=tot-1; e[tot].c=0; e[tot].nxt=head[y]; head[y]=tot;
}

void bfs(int S,int T){
	memset(lvl,-1,sizeof lvl); lvl[S]=0;
	int tt=0,ww=1; q[ww]=S;
	while (tt<ww){
		int u=q[++tt];
		for (int i=head[u],v;i;i=e[i].nxt)
			if (e[i].c&&lvl[v=e[i].v]==-1){
				q[++ww]=v;
				lvl[v]=lvl[u]+1;
			}
	}
}

int dfs(int u,int T,int mx){
	if (u==T) return 1;
	for (int &i=iter[u],v;i;i=e[i].nxt)
		if (e[i].c&&lvl[v=e[i].v]==lvl[u]+1){
			int d=dfs(v,T,1);
			if (d){
				e[i].c-=d; e[e[i].r].c+=d;
				return d;
			}
		}
	return 0;
}

int dinic(){
	int flow=0;
	while (1){
		bfs(S,T);
		if (lvl[T]==-1) break;
		memcpy(iter,head,sizeof iter);
		for (int ff=dfs(S,T,1);ff;ff=dfs(S,T,1)) flow+=ff;
	}
	return flow;
}

int main(){
	scanf("%d",&n);
	for (int i=0;i<n;++i) scanf("%d",a+i);
	for (int i=0;i<n;++i) scanf("%d",b+i);
	S=++m; T=++m;
	ans=n*2;
	for (int i=0;i<n;++i){
		if (!visa[i]){
			++m;
			for (int j=i;!visa[j];j=a[j]) visa[j]=m;
			if (a[i]==i) --ans;
		}
	}
	for (int i=0;i<n;++i){
		if (!visb[i]){
			++m;
			for (int j=i;!visb[j];j=b[j]) visb[j]=m;
			if (b[i]==i) --ans;
		}
	}
	for (int i=0;i<n;++i){
		if (a[i]!=i) add(S,visa[i],1);
		if (b[i]!=i) add(visb[i],T,1);
		if (a[i]!=i&&b[i]!=i){
			add(visa[i],visb[i],1);
			if (a[i]==b[i]) add(visa[i],visb[i],1);
		}
	}
	printf("%d\n",ans-dinic());
	
	return 0;
}
			