//用动态规划
//若s1[i]==s2[j] dp[i][j]=dp[i-1][j-1]+1
//若s1[i]!=s2[j] 则dp[i][j]=max(dp[i-1][j],dp[i][j-1])
//dp[i][j] 表示在字符串s1长度为i,字符串s2长度为j的前提下 最长公共子序列长度
//string 和memset(数组名,初值,范围) 在#include<csting>中
#include<iostream>
#include<cstring>
#include<math.h>
using namespace std;
int dp[101][101];
string a;
string b;
int main(){
cin>>a;
cin>>b;
memset(dp,0,sizeof(dp));
int len1 = a.length();
int len2 = b.length();
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(a[i-1]==b[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[len1][len2];
// cout<<a[1];
return 0;
}