#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int S=0,T;
int p[100005],q[100005],idp[100005],idq[100005],tot;
struct edge{
	int s,t,cap,nxt;
}e[200005];
int last[200005],e_cnt;
inline void add(int a,int b,int c){
	e[e_cnt]=(edge){a,b,c,last[a]};
	last[a]=e_cnt++;
}
int d[200005];
int Q[200005],h,t;
bool bfs(){
	memset(d,63,sizeof(d));
	d[S]=0;
	h=t=0;
	Q[++t]=S;
	while(h<t){
		h++;
		for(int i=last[Q[h]];i!=-1;i=e[i].nxt)if(e[i].cap>0&&d[e[i].t]>d[Q[h]]+1){
			d[e[i].t]=d[Q[h]]+1;
			Q[++t]=e[i].t;
		}
	}
	return d[T]<1e8;
}
int cur[200005];
int dfs(int x,int Cap){
	if(x==T)return Cap;
	int res=0;
	for(int &i=cur[x];i!=-1;i=e[i].nxt)if(e[i].cap&&d[e[i].t]==d[x]+1){
		int t=dfs(e[i].t,min(Cap,e[i].cap));
		e[i].cap-=t;
		e[i^1].cap+=t;
		Cap-=t;
		res+=t;
		if(Cap<=0)break;
	}
	return res;
}
int dinic(){
	int res=0;
	while(bfs()){
		for(int i=0;i<=T;i++)cur[i]=last[i];
		res+=dfs(S,1e9);
		// printf("%d\n",res);
		// return res;
	}
	return res;
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&p[i]);
	for(int i=0;i<n;i++)scanf("%d",&q[i]);
	for(int i=0;i<n;i++)if(!idp[i]){
		idp[i]=++tot;
		int j=p[i];
		while(j!=i)idp[j]=tot,j=p[j];
	}
	for(int i=0;i<n;i++)if(!idq[i]){
		idq[i]=++tot;
		int j=q[i];
		while(j!=i)idq[j]=tot,j=q[j];
	}
	T=tot+1;
	int ans=n;
	memset(last,-1,sizeof(last));
	for(int i=0;i<n;i++)
		if(p[i]==i)
			if(q[i]==i)ans--;
			else add(idq[i],T,1),add(T,idq[i],0);
		else
			if(q[i]==i)add(S,idp[i],1),add(idp[i],S,0);
			else if(p[i]==q[i])add(idp[i],idq[i],1),add(idq[i],idp[i],1);
				 else add(idq[i],idp[i],1),add(idp[i],idq[i],0);
	printf("%d\n",ans-dinic());
	return 0;
}