include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
const int len = 20;
int source[len];
int target[len];
int index[len];
int max_len[len];
int sub_max(int sub_len)
{
int m =-1;
int local = -1;
for(int i=0; i<sub_len; i++)
{
if(index[i]<index[sub_len])
{
if(m<max_len[i])
{
m = max_len[i];
local = i;
}
}
}
return local;
}
int find_max_len(int n)
{
int i,j;
int max = 0;
for(i=0; i<n; i++)
{
if(i==0)
{
max_len[i] = 1;
}
else
{
int t = sub_max(i);
if(t == -1)
{
max_len[i] = 1;
}
else
{
max_len[i] = max_len[t] + 1;
}
}
if(max<max_len[i])
{
max = max_len[i];
}
}
return max;
}
void convert_string_to_intarray(string str,int *s,int n)
{
int flag;
int temp;
int slen = str.length();
int j=0;
temp = 0;
for(int i=0; i<n; i++)
{
flag = 0;
while(flag ==0 )
{
while( j<slen&&( str.at(j) != ' ' ))
{
temp = temp * 10 + str.at(j) - '0';
j++;
flag = 1;
}
if (flag ==0)
{
j++;
}
}
if(flag==1)
{
*(s+temp-1) = i;
temp = 0;
}
}
}
int main()
{
int n,m;
string str;
int *p;
int flag1= 0;
while(getline(cin,str,'/n'))
{
if( (m=(int)count(str.begin(),str.end(),' ')) == 0)
{
n = atoi(str.c_str());
flag1 = 1;
continue;
}
if(flag1==1)
{
convert_string_to_intarray(str,source,n);
flag1 = 0;
}
else
{
convert_string_to_intarray(str,target,n);
for(int i=0; i<n; i++)
{
p = find(source,source+n,target[i]);
index[i] = (p-source)+1;
}
cout<<find_max_len(n)<<endl;
}
}
return 0;
}