#include<iostream>   
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<vector>
#include<list>
#include<map>
#include<algorithm>
typedef long long LL;
using namespace std;
const int maxn=100;

const int N = 1000;
int dp[N][N];
#define max(a, b)(a>b ? a:b)
int LCS(string a, string b)
{
memset(dp, sizeof(dp), 0);
for(int i=1; i<=a.length(); i++)
{
for(int j=1; j<=b.length(); 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]);
}
}
}
return dp[a.length()][b.length()];
}

void solve()
{
string a, b;
while( cin >> a >> b)
{
int ret = LCS(a, b);
cout << ret << endl; //输出最长公共子序列(不连续) 的长度
}
}
int main()
{
solve();
return 0;
}


int dp[m+1][n+1];
int Lcs()
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(s1[i]==s2[j])
dp[i+1][j+1]= dp[i][j]+1;
else
dp[i+1][j+1]= max(dp[i+1][j],dp[i][j+1]);
return dp[m][n];
}