#include<bits/stdc++.h>
using namespace std;
const int N=4e5+5;
const int inf=1e9;
inline int read(){
	register int x=0;
	register char ch=getchar();
	while(ch<'0'||ch>'9')	ch=getchar();
	while(ch>='0'&&ch<='9')	x=x*10+(ch^48),ch=getchar();
	return x;
}
int n,s,nx,ny,ans,now=1,a[N],b[N],v[N],w[N],fx[N],fy[N],cr[N],nex[N],dis[N],head[N];
void addedges(int x,int y,int z){
	nex[++now]=head[x],v[now]=y;
	head[x]=now,w[now]=z;
}
void add(int x,int y){
	addedges(x,y,1);
	addedges(y,x,0);
}
queue<int>que;
bool bfs(){
	for(int i=0;i<=s;i++)	cr[i]=head[i],dis[i]=0;
	que.push(s),dis[s]=1;
	while(!que.empty()){
		int x=que.front();	que.pop();
		for(int i=head[x];i;i=nex[i])
			if(w[i]&&!dis[v[i]]){
				dis[v[i]]=dis[x]+1;
				que.push(v[i]);
			}
	}
	return dis[0];
}
int dfs(int x,int f){
	int ans=0;
	if(!x||!f)	return f;
	for(int &i=cr[x];i;i=nex[i])
		if(w[i]&&dis[v[i]]==dis[x]+1){
			int d=dfs(v[i],min(w[i],f));
			if(!d)	continue;
			ans+=d,w[i]-=d;
			w[i^1]+=d,f-=d;
			if(!f)	break;
		}
	if(!ans)	dis[x]=-1;
	return ans;
}
int main(){
	ans=n=read();
	for(int i=1;i<=n;i++)	a[i]=read()+1;
	for(int i=1;i<=n;i++)	b[i]=read()+1;
	for(int i=1,k;i<=n;i++){
		if(!fx[i]){
			++nx,k=i;
			while(!fx[k])	fx[k]=nx,k=a[k];
		}
		if(!fy[i]){
			++ny,k=i;
			while(!fy[k])	fy[k]=ny,k=b[k];
		}
	}
	s=nx+ny+1;
	for(int i=1;i<=n;i++){
		if(a[i]==i&&b[i]==i)	--ans;
		else	if(a[i]!=i&&b[i]==i)	add(s,fx[i]);
		else	if(a[i]==i&&b[i]!=i)	add(fy[i]+nx,0);
		else	if(a[i]!=i&&b[i]!=i&&a[i]!=b[i])	add(fy[i]+nx,fx[i]);
		else	add(fx[i],fy[i]+nx),add(fy[i]+nx,fx[i]);
	}
	while(bfs())
	while(int d=dfs(s,inf))	ans-=d;
	printf("%d\n",ans);
}
