//////////////////////////////////////// ////////////////////////////
// Longest public substring
// Typical DP example
# Include <iostream>
# Include <string>
Using namespace STD;
Char X [2, 10000], Y [2, 10000];
Void lcslength (int m, int N, char * X, char * y, int ** C, int ** B)
{
Int I, J;
For (I = 0; I <= m; I ++)
C [I] [0] = 0;
For (I = 1; I <= N; I ++)
C [0] [I] = 0;
For (I = 1; I <= m; I ++)
For (j = 1; j <= N; j ++)
{
If (X [I-1] = Y [J-1]) // note that X [], Y [] is from 0 in the input
{
C [I] [J] = C [I-1] [J-1] + 1;
B [I] [J] = 1;
}
Else if (C [I-1] [J]> = C [I] [J-1])
{
C [I] [J] = C [I-1] [J];
B [I] [J] = 2;
}
Else
{
C [I] [J] = C [I] [J-1];
B [I] [J] = 3;
}
}
}
/*
Void LCS (int I, Int J, char * X, int ** B)
{
If (I = 0 | j = 0)
Return;
If (B [I] [J] = 1)
{
LCS (I-1, J-1, X, B );
Cout <X [I-1];
}
Else if (B [I] [J] = 2)
LCS (I-1, J, X, B );
Else
LCS (I, J-1, X, B );
}
*/
Int main ()
{
Int m, n, I;
While (CIN> x> Y)
{
M = strlen (X );
N = strlen (y );
Int ** ptrc = new int * [M + 1];
Int ** ptrb = new int * [M + 1];
For (I = 0; I <= m; I ++)
{
Ptrc [I] = new int [n + 1];
Ptrb [I] = new int [n + 1];
}
Lcslength (m, n, x, y, ptrc, ptrb );
// LCS (m, n, x, ptrb );
Cout <ptrc [m] [N] <Endl;
}
Return 0;
}