#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
int* compute_help_table(const string & A,const string & B);
string lcs(const string & A, const string & B);
string simple_solution(const string & A, const string & B);
int main(void) {
string A,B;
cin>>A>>B;
cout << lcs(A, B).size() << endl;
return 0;
}
string lcs(const string &A, const string &B) {
int m = A.size();
int n = B.size();
if (m == 0 || n == 0) {
return "";
}
else if(m == 1) {
return simple_solution(A, B);
}
else if(n == 1) {
return simple_solution(B, A);
}
else {
int i = m / 2;
string Asubstr = A.substr(i, m - i);
//reverse(Asubstr.begin(), Asubstr.end());
string Brev = B;
reverse(Brev.begin(), Brev.end());
int* L1 = compute_help_table(A.substr(0, i), B);
int* L2 = compute_help_table(Asubstr, Brev);
int k;
int M = -1;
for(int j = 0; j <= n; j++) {
if(M < L1[j] + L2[n-j]) {
M = L1[j] + L2[n-j];
k = j;
}
}
delete [] L1;
delete [] L2;
return lcs(A.substr(0, i), B.substr(0, k)) + lcs(A.substr(i, m - i), B.substr(k, n - k));
}
}
int* compute_help_table(const string &A, const string &B) {
int m = A.size();
int n = B.size();
int* first = new int[n+1];
int* second = new int[n+1];
for(int i = 0; i <= n; i++) {
second[i] = 0;
}
for(int i = 0; i < m; i++) {
for(int k = 0; k <= n; k++) {
first[k] = second[k];
}
for(int j = 0; j < n; j++) {
if(j == 0) {
if (A[i] == B[j])
second[1] = 1;
}
else {
if(A[i] == B[j]) {
second[j+1] = first[j] + 1;
}
else {
second[j+1] = max(second[j], first[j+1]);
}
}
}
}
delete [] first;
return second;
}
string simple_solution(const string & A, const string & B) {
int i = 0;
for(; i < B.size(); i++) {
if(B.at(i) == A.at(0))
return A;
}
return "";
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjc3RkaW8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKaW50KiBjb21wdXRlX2hlbHBfdGFibGUoY29uc3Qgc3RyaW5nICYgQSxjb25zdCBzdHJpbmcgJiBCKTsKc3RyaW5nIGxjcyhjb25zdCBzdHJpbmcgJiBBLCBjb25zdCBzdHJpbmcgJiBCKTsKc3RyaW5nIHNpbXBsZV9zb2x1dGlvbihjb25zdCBzdHJpbmcgJiBBLCBjb25zdCBzdHJpbmcgJiBCKTsKIAppbnQgbWFpbih2b2lkKSB7CiAgICBzdHJpbmcgQSxCOwogICAgY2luPj5BPj5COwogICAKICAgIGNvdXQgPDwgbGNzKEEsIEIpLnNpemUoKSA8PCBlbmRsOwogCiAgICByZXR1cm4gMDsKfQogCnN0cmluZyBsY3MoY29uc3Qgc3RyaW5nICZBLCBjb25zdCBzdHJpbmcgJkIpIHsKICAgIGludCBtID0gQS5zaXplKCk7CiAgICBpbnQgbiA9IEIuc2l6ZSgpOwogCiAgICBpZiAobSA9PSAwIHx8IG4gPT0gMCkgewogICAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGVsc2UgaWYobSA9PSAxKSB7CiAgICAgICAgcmV0dXJuIHNpbXBsZV9zb2x1dGlvbihBLCBCKTsKICAgIH0KICAgIGVsc2UgaWYobiA9PSAxKSB7CiAgICAgICAgcmV0dXJuIHNpbXBsZV9zb2x1dGlvbihCLCBBKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGludCBpID0gbSAvIDI7CiAgICAgICAKICAgICAgICBzdHJpbmcgQXN1YnN0ciA9IEEuc3Vic3RyKGksIG0gLSBpKTsKICAgICAgICAvL3JldmVyc2UoQXN1YnN0ci5iZWdpbigpLCBBc3Vic3RyLmVuZCgpKTsKICAgICAgICBzdHJpbmcgQnJldiA9IEI7CiAgICAgICAgcmV2ZXJzZShCcmV2LmJlZ2luKCksIEJyZXYuZW5kKCkpOwogCiAgICAgICAgaW50KiBMMSA9IGNvbXB1dGVfaGVscF90YWJsZShBLnN1YnN0cigwLCBpKSwgQik7CiAgICAgICAgaW50KiBMMiA9IGNvbXB1dGVfaGVscF90YWJsZShBc3Vic3RyLCBCcmV2KTsKICAgICAgIAogICAgICAgIGludCBrOwogICAgICAgIGludCBNID0gLTE7CiAgICAgICAgZm9yKGludCBqID0gMDsgaiA8PSBuOyBqKyspIHsKICAgICAgICAgICAgaWYoTSA8IEwxW2pdICsgTDJbbi1qXSkgewogICAgICAgICAgICAgICAgTSA9IEwxW2pdICsgTDJbbi1qXTsKICAgICAgICAgICAgICAgIGsgPSBqOwogICAgICAgICAgICB9CiAgICAgICAgfQogCiAgICAgICAgZGVsZXRlIFtdIEwxOwogICAgICAgIGRlbGV0ZSBbXSBMMjsKIAogICAgICAgIHJldHVybiBsY3MoQS5zdWJzdHIoMCwgaSksIEIuc3Vic3RyKDAsIGspKSArIGxjcyhBLnN1YnN0cihpLCBtIC0gaSksIEIuc3Vic3RyKGssIG4gLSBrKSk7CiAgICB9Cn0KIAppbnQqIGNvbXB1dGVfaGVscF90YWJsZShjb25zdCBzdHJpbmcgJkEsIGNvbnN0IHN0cmluZyAmQikgewogICAgaW50IG0gPSBBLnNpemUoKTsKICAgIGludCBuID0gQi5zaXplKCk7CiAKICAgIGludCogZmlyc3QgPSBuZXcgaW50W24rMV07CiAgICBpbnQqIHNlY29uZCA9IG5ldyBpbnRbbisxXTsKIAogICAgZm9yKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHsKICAgICAgICBzZWNvbmRbaV0gPSAwOwogICAgfQogCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgZm9yKGludCBrID0gMDsgayA8PSBuOyBrKyspIHsKICAgICAgICAgICAgZmlyc3Rba10gPSBzZWNvbmRba107ICAKICAgICAgICB9CiAKICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgIGlmKGogPT0gMCkgewogICAgICAgICAgICAgICAgaWYgKEFbaV0gPT0gQltqXSkKICAgICAgICAgICAgICAgICAgICBzZWNvbmRbMV0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYoQVtpXSA9PSBCW2pdKSB7CiAgICAgICAgICAgICAgICAgICAgc2Vjb25kW2orMV0gPSBmaXJzdFtqXSArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZWNvbmRbaisxXSA9IG1heChzZWNvbmRbal0sIGZpcnN0W2orMV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogCiAgICBkZWxldGUgW10gZmlyc3Q7CiAgICByZXR1cm4gc2Vjb25kOwp9CiAKc3RyaW5nIHNpbXBsZV9zb2x1dGlvbihjb25zdCBzdHJpbmcgJiBBLCBjb25zdCBzdHJpbmcgJiBCKSB7CiAgICBpbnQgaSA9IDA7CiAgICBmb3IoOyBpIDwgQi5zaXplKCk7IGkrKykgewogICAgICAgIGlmKEIuYXQoaSkgPT0gQS5hdCgwKSkKICAgICAgICAgICAgcmV0dXJuIEE7CiAgICB9CiAKICAgIHJldHVybiAiIjsKfQ==