#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int N,M,L;
vector<set<int>>before;
set<int>want;
vector<int>order;
const int maxn = 210;
int findinv(int x)
{
int ind = -1;
for (int i = 0; i < order.size(); i++)
{
if (order[i] == x)
{
ind = i;
}
}
return ind;
}
int main()
{
scanf("%d", &N);
scanf("%d", &M);
for (int i = 0; i < M;i++)
{
int w;
scanf("%d", &w);
want.insert(w);
order.push_back(w);
}
set<int>temp;
if (order.size() > 0)
{
temp.insert(order[0]);
before.push_back(temp);
for (int i = 1; i < order.size(); i++)
{
set<int>temp;
temp = before[i - 1];
temp.insert(order[i]);
before.push_back(temp);
}
}
scanf("%d", &L);
int ans = 0;
int A[100010];
int dp[maxn] = {0};
for (int i = 0; i < L; i++)
{
scanf("%d", &A[i]);
}
for (int i = 0; i < L; i++)
{
int index = findinv(A[i]);
if (index != -1)
{
for (int j = 0; j < i; j++)
{
if (before[index].count(A[j]) > 0)
{
if (dp[i] < dp[j] + 1)
{
dp[i] = dp[j] + 1;
}
}
}
if (dp[i] == 0)
dp[i] = 1;
}
ans = max(ans, dp[i]);
}
cout << ans;
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int N,M,L;
vector<set<int>>before;
set<int>want;
vector<int>order;
const int maxn = 10010;
int hashtable[maxn] ;
int A[maxn];
int main()
{
scanf("%d", &N);
scanf("%d", &M);
fill(hashtable, hashtable + maxn, -1);
for (int i = 1; i <= M;i++)
{
int w;
scanf("%d", &w);
hashtable[w] = i;
}
scanf("%d", &L);
for (int i = 0; i < L; i++)
{
scanf("%d", &A[i]);
A[i] = hashtable[A[i]];
}
int ans = 0;
int dp[maxn] = {0};
for (int i = 0; i < L; i++)
{
if (A[i] != -1)
{
dp[i] = 1;
for (int j = 0; j < i; j++)
{
if (A[j] <= A[i] && dp[i] < dp[j] + 1)
{
dp[i] = dp[j] + 1;
}
}
}
ans = max(ans, dp[i]);
}
cout << ans;
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int N,M,L;
vector<set<int>>before;
set<int>want;
vector<int>order;
const int maxn = 10010;
int hashtable[maxn] ;
int A[maxn];
int B[210];
int dp[maxn][210];
int main()
{
scanf("%d", &N);
scanf("%d", &M);
fill(hashtable, hashtable + maxn, -1);
for (int i = 1; i <= M;i++)
{
int w;
scanf("%d", &B[i]);
}
scanf("%d", &L);
for (int i = 1; i <= L; i++)
{
scanf("%d", &A[i]);
}
for (int i = 0; i <= L; i++)
{
dp[i][0] = 0;
}
for (int i = 0; i <= M; i++)
{
dp[0][i] = 0;
}
for (int i = 1; i <= L; i++)
{
for (int j = 1; j <= M; j++)
{
if (A[i] == B[j])
{
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + 1;
}
else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
cout << dp[L][M];
return 0;
}