#include<iostream>
#include<string>
using namespace std;
int n;
int m;
char a[1010];
char b[1010];
int dp[1010][1010]; //存储每个i,j对应的状态 就是教材的c[i,j];
int lcs()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
if (a[i] == b[j])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = (dp[i - 1][j] > dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1];
}
return dp[n][m];
}
int main()
{
cin>> n;
cin >> m;
for (int i = 1; i <=n; i++)
cin >> a[i];
for (int i =1; i <= m; i++)
cin >> b[i];
cout << lcs();
return 0;
}
//主要思想 dp[i][j]表示a的前i个子串和b的前j个子串的最大公共子序列
//
// dp[i-1][j-1]+1 (a[i]==b[j])
//dp[i][j]=max(dp[i][j-1],dp[i-1][j]) (如果最后一个不相同)
//