const int MAXN=1005,Mod=1e9+7;
namespace KM{
const int MAXN=505,Inf=1e9;
int n,w[MAXN][MAXN],lx[MAXN],ly[MAXN],lack[MAXN],p[MAXN];
int linkx[MAXN],linky[MAXN],visx[MAXN],visy[MAXN];
void init(int _n){
n=_n;
_rep(i,1,n)
ly[i]=linkx[i]=linky[i]=visx[i]=visy[i]=0;
_rep(i,1,n)
_rep(j,1,n)
w[i][j]=0;
}
void augment(int pos){
int temp;
while(pos){
temp=linkx[p[pos]];
linkx[p[pos]]=pos;
linky[pos]=p[pos];
pos=temp;
}
}
void bfs(int s,int k){
queue<int>q;
_rep(i,1,n)
lack[i]=Inf;
q.push(s);
while(true){
while(!q.empty()){
int u=q.front();q.pop();
visx[u]=k;
_rep(v,1,n){
if(visy[v]==k)
continue;
if(lx[u]+ly[v]-w[u][v]<lack[v]){
lack[v]=lx[u]+ly[v]-w[u][v];p[v]=u;
if(!lack[v]){
visy[v]=k;
if(!linky[v])
return augment(v);
else
q.push(linky[v]);
}
}
}
}
int a=Inf;
_rep(i,1,n) if(visy[i]!=k)
a=min(a,lack[i]);
_rep(i,1,n){
if(visx[i]==k)lx[i]-=a;
if(visy[i]==k)ly[i]+=a;
else lack[i]-=a;
}
_rep(i,1,n){
if(visy[i]!=k&&!lack[i]){
visy[i]=k;
if(!linky[i])
return augment(i);
else
q.push(linky[i]);
}
}
}
}
int get_pair(){
int k=0;
_rep(i,1,n){
lx[i]=-Inf;
_rep(j,1,n)
lx[i]=max(lx[i],w[i][j]);
}
_rep(i,1,n)
bfs(i,i);
int ans=0;
_rep(i,1,n)
ans+=w[linky[i]][i];
return ans;
}
}
struct Edge{
int to,next;
}edge[MAXN<<1];
int n,head[MAXN],edge_cnt;
void Insert(int u,int v){
edge[++edge_cnt]=Edge{v,head[u]};
head[u]=edge_cnt;
}
int root[2],sz[MAXN],mson[MAXN],tot_sz,root_sz;
int h1[MAXN],h2[MAXN],dp[MAXN][MAXN];
void Hash(int u){
sz[u]=1,h1[u]=h2[u]=0;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
Hash(v);
sz[u]+=sz[v];
h1[u]=(h1[u]+1LL*h1[v]*sz[v])%Mod;
h2[u]=(h2[u]+1LL*h2[v]*sz[v])%Mod;
}
h1[u]=(h1[u]+sz[u])%Mod;
h2[u]=(1LL*h2[u]*sz[u]+sz[u])%Mod;
}
bool cmp(int a,int b){return (h1[a]==h1[b])&&(h2[a]==h2[b]);}
void dfs(int u1,int u2){
if(~dp[u1][u2])return;
int cnt=0;
for(int i=head[u1];i;i=edge[i].next){
int v1=edge[i].to;
for(int j=head[u2];j;j=edge[j].next){
int v2=edge[j].to;
if(cmp(v1,v2))dfs(v1,v2);
}
cnt++;
}
KM::init(cnt);
for(int i=head[u1],pos1=1;i;i=edge[i].next,pos1++){
int v1=edge[i].to;
for(int j=head[u2],pos2=1;j;j=edge[j].next,pos2++){
int v2=edge[j].to;
if(cmp(v1,v2))
KM::w[pos1][pos2]=dp[v1][v2];
}
}
dp[u1][u2]=KM::get_pair()+((u1+n)==u2);
}
int main()
{
n=read_int();
_rep(i,1,n){
int p=read_int();
if(p)Insert(p,i);
else root[0]=i;
}
Hash(root[0]);
_rep(i,1,n){
int p=read_int()+n;
if(p!=n)Insert(p,i+n);
else root[1]=i+n;
}
Hash(root[1]);
mem(dp,-1);
dfs(root[0],root[1]);
enter(n-dp[root[0]][root[1]]);
return 0;
}