//用动态规划 
//若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;
}