#include <bits/stdc++.h>
using namespace std;
struct LCS {
struct Vec {
int W;
vector<uint64_t> v;
Vec(): W(0){}
Vec(int n) {
reset(n);
}
void reset(int n) { W=(n+63)>>6; v.assign(W,0); }
void clear() { fill(v.begin(), v.end(), 0); }
void setbit(int i) { v[i>>6] |= (1ull<<(i&63)); }
static void OR(Vec &o, const Vec &a, const Vec &b) {
for (int i=0; i<a.W; i++)
o.v[i]=a.v[i]|b.v[i];
}
static void AND(Vec &o, const Vec &a, const Vec &b) {
for (int i=0; i<a.W; i++)
o.v[i]=a.v[i]&b.v[i];
}
static void NOT(Vec &o, const Vec &a) {
for (int i=0; i<a.W; i++)
o.v[i]=~a.v[i];
}
static void SHL1(Vec &o, const Vec &a) {
uint64_t c=0;
for (int i=0; i<a.W; i++) {
uint64_t nv=a.v[i]<<1|c;
c=a.v[i]>>63;
o.v[i]=nv;
}
}
static void SUB(Vec& o, const Vec& a, const Vec& b) {
uint64_t bor=0;
for(int i=0; i<a.W; i++) {
unsigned __int128 bi=(unsigned __int128)b.v[i]+bor;
unsigned __int128 ai=a.v[i];
o.v[i]=(uint64_t)(ai-bi);
bor=ai<bi;
}
}
int popcnt() const {
int s=0;
for(auto x: v)
s+=__builtin_popcountll(x);
return s;
}
};
// --- prefix LCS lengths: L[j] = LCS(A[as..ae], B[bs..bs+j-1]) ---
static vector<int> pref(string &A, int as, int ae, string &B, int bs, int be) {
int n=ae-as+1, m=be-bs+1;
array<Vec, 256> M;
for (int c=0; c<256; c++) M[c]=Vec(n);
for (int i=0; i<n; i++) M[(unsigned char)A[as+i]].setbit(i);
Vec S(n), X(n), Y(n), T(n), NX(n);
S.clear();
vector<int> L(m+1, 0);
for (int j=0; j<m; j++) {
unsigned char ch=(unsigned char)B[bs+j];
Vec::OR(X, M[ch], S);
Vec::SHL1(Y, S);
if (Y.W) Y.v[0]|=1ULL;
Vec::SUB(T, X, Y);
Vec::NOT(NX, T);
Vec::AND(S, X, NX);
L[j+1]=S.popcnt();
}
return L;
}
// --- suffix LCS lengths: R[k] = LCS(A[mid+1..ae], B[bs+k..be]) ---
static vector<int> suff(string &A, int as, int ae, string &B, int bs, int be) {
string Ar, Br;
Ar.reserve(ae-as+1);
Br.reserve(be-bs+1);
for (int i=ae; i>=as; i--) Ar.push_back(A[i]);
for (int j=be; j>=bs; j--) Br.push_back(B[j]);
return pref(Ar, 0, (int)Ar.size()-1, Br, 0, (int)Br.size()-1);
}
static string lcs(string &a, string &b, int as, int ae, int bs, int be) {
if (as>ae || bs>be) return "";
if (as==ae) {
for (int j=bs; j<=be; j++) if (a[as]==b[j])
return string(1, a[as]);
return "";
}
int amid=(as+ae)/2;
auto L1=pref(a, as, amid, b, bs, be);
auto L2=suff(a, amid+1, ae, b, bs, be);
int best=-1, bj=0;
for (int j=0; j<=be-bs+1; j++) {
int c=L1[j]+L2[be-bs+1-j];
if (c>best)
best=c, bj=j;
}
string l=lcs(a, b, as, amid, bs, bs+bj-1);
string r=lcs(a, b, amid+1, ae, bs+bj, be);
return l+r;
}
// --- open API ---
static pair<int, string> run(string& a, string& b) {
if (a.empty() || b.empty())
return {0,""};
string s=lcs(a, b, 0, a.size()-1, 0, b.size()-1);
return {s.size(), s};
}
};
int main() {
cin.tie(0)->sync_with_stdio(0);
string a, b;
cin >> a >> b;
auto [len, s]=LCS::run(a, b);
cout << len << '\n' << s;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTENTIHsKICAgIHN0cnVjdCBWZWMgewogICAgICAgIGludCBXOwogICAgICAgIHZlY3Rvcjx1aW50NjRfdD4gdjsKICAgICAgICBWZWMoKTogVygwKXt9CiAgICAgICAgVmVjKGludCBuKSB7CiAgICAgICAgICAgIHJlc2V0KG4pOwogICAgICAgIH0KICAgICAgICB2b2lkIHJlc2V0KGludCBuKSB7IFc9KG4rNjMpPj42OyB2LmFzc2lnbihXLDApOyB9CiAgICAgICAgdm9pZCBjbGVhcigpIHsgZmlsbCh2LmJlZ2luKCksIHYuZW5kKCksIDApOyB9CiAgICAgICAgdm9pZCBzZXRiaXQoaW50IGkpIHsgdltpPj42XSB8PSAoMXVsbDw8KGkmNjMpKTsgfQogICAgICAgIHN0YXRpYyB2b2lkIE9SKFZlYyAmbywgY29uc3QgVmVjICZhLCBjb25zdCBWZWMgJmIpIHsKICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGEuVzsgaSsrKQogICAgICAgICAgICAgICAgby52W2ldPWEudltpXXxiLnZbaV07CiAgICAgICAgfQogICAgICAgIHN0YXRpYyB2b2lkIEFORChWZWMgJm8sIGNvbnN0IFZlYyAmYSwgY29uc3QgVmVjICZiKSB7CiAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhLlc7IGkrKykKICAgICAgICAgICAgICAgIG8udltpXT1hLnZbaV0mYi52W2ldOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgdm9pZCBOT1QoVmVjICZvLCBjb25zdCBWZWMgJmEpIHsKICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGEuVzsgaSsrKQogICAgICAgICAgICAgICAgby52W2ldPX5hLnZbaV07CiAgICAgICAgfQogICAgICAgIHN0YXRpYyB2b2lkIFNITDEoVmVjICZvLCBjb25zdCBWZWMgJmEpIHsKICAgICAgICAgICAgdWludDY0X3QgYz0wOwogICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8YS5XOyBpKyspIHsKICAgICAgICAgICAgICAgIHVpbnQ2NF90IG52PWEudltpXTw8MXxjOwogICAgICAgICAgICAgICAgYz1hLnZbaV0+PjYzOwogICAgICAgICAgICAgICAgby52W2ldPW52OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRpYyB2b2lkIFNVQihWZWMmIG8sIGNvbnN0IFZlYyYgYSwgY29uc3QgVmVjJiBiKSB7CiAgICAgICAgICAgIHVpbnQ2NF90IGJvcj0wOwogICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxhLlc7IGkrKykgewogICAgICAgICAgICAgICAgdW5zaWduZWQgX19pbnQxMjggYmk9KHVuc2lnbmVkIF9faW50MTI4KWIudltpXStib3I7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBfX2ludDEyOCBhaT1hLnZbaV07CiAgICAgICAgICAgICAgICBvLnZbaV09KHVpbnQ2NF90KShhaS1iaSk7CiAgICAgICAgICAgICAgICBib3I9YWk8Ymk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW50IHBvcGNudCgpIGNvbnN0IHsKICAgICAgICAgICAgaW50IHM9MDsKICAgICAgICAgICAgZm9yKGF1dG8geDogdikKICAgICAgICAgICAgICAgIHMrPV9fYnVpbHRpbl9wb3Bjb3VudGxsKHgpOwogICAgICAgICAgICByZXR1cm4gczsKICAgICAgICB9CiAgICB9OwoKICAgIC8vIC0tLSBwcmVmaXggTENTIGxlbmd0aHM6IExbal0gPSBMQ1MoQVthcy4uYWVdLCBCW2JzLi5icytqLTFdKSAtLS0KICAgIHN0YXRpYyB2ZWN0b3I8aW50PiBwcmVmKHN0cmluZyAmQSwgaW50IGFzLCBpbnQgYWUsIHN0cmluZyAmQiwgaW50IGJzLCBpbnQgYmUpIHsKICAgICAgICBpbnQgbj1hZS1hcysxLCBtPWJlLWJzKzE7CiAgICAgICAgYXJyYXk8VmVjLCAyNTY+IE07CiAgICAgICAgZm9yIChpbnQgYz0wOyBjPDI1NjsgYysrKSBNW2NdPVZlYyhuKTsKICAgICAgICBmb3IgKGludCBpPTA7IGk8bjsgaSsrKSBNWyh1bnNpZ25lZCBjaGFyKUFbYXMraV1dLnNldGJpdChpKTsKICAgICAgICBWZWMgUyhuKSwgWChuKSwgWShuKSwgVChuKSwgTlgobik7CiAgICAgICAgUy5jbGVhcigpOwogICAgICAgIHZlY3RvcjxpbnQ+IEwobSsxLCAwKTsKICAgICAgICBmb3IgKGludCBqPTA7IGo8bTsgaisrKSB7CiAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY2g9KHVuc2lnbmVkIGNoYXIpQlticytqXTsKICAgICAgICAgICAgVmVjOjpPUihYLCBNW2NoXSwgUyk7CiAgICAgICAgICAgIFZlYzo6U0hMMShZLCBTKTsKICAgICAgICAgICAgaWYgKFkuVykgWS52WzBdfD0xVUxMOwogICAgICAgICAgICBWZWM6OlNVQihULCBYLCBZKTsKICAgICAgICAgICAgVmVjOjpOT1QoTlgsIFQpOwogICAgICAgICAgICBWZWM6OkFORChTLCBYLCBOWCk7CiAgICAgICAgICAgIExbaisxXT1TLnBvcGNudCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTDsKICAgIH0KICAgIC8vIC0tLSBzdWZmaXggTENTIGxlbmd0aHM6IFJba10gPSBMQ1MoQVttaWQrMS4uYWVdLCBCW2JzK2suLmJlXSkgLS0tCiAgICBzdGF0aWMgdmVjdG9yPGludD4gc3VmZihzdHJpbmcgJkEsIGludCBhcywgaW50IGFlLCBzdHJpbmcgJkIsIGludCBicywgaW50IGJlKSB7CiAgICAgICAgc3RyaW5nIEFyLCBCcjsKICAgICAgICBBci5yZXNlcnZlKGFlLWFzKzEpOwogICAgICAgIEJyLnJlc2VydmUoYmUtYnMrMSk7CiAgICAgICAgZm9yIChpbnQgaT1hZTsgaT49YXM7IGktLSkgQXIucHVzaF9iYWNrKEFbaV0pOwogICAgICAgIGZvciAoaW50IGo9YmU7IGo+PWJzOyBqLS0pIEJyLnB1c2hfYmFjayhCW2pdKTsKICAgICAgICByZXR1cm4gcHJlZihBciwgMCwgKGludClBci5zaXplKCktMSwgQnIsIDAsIChpbnQpQnIuc2l6ZSgpLTEpOwogICAgfQoKICAgIHN0YXRpYyBzdHJpbmcgbGNzKHN0cmluZyAmYSwgc3RyaW5nICZiLCBpbnQgYXMsIGludCBhZSwgaW50IGJzLCBpbnQgYmUpIHsKICAgICAgICBpZiAoYXM+YWUgfHwgYnM+YmUpIHJldHVybiAiIjsKICAgICAgICBpZiAoYXM9PWFlKSB7CiAgICAgICAgICAgIGZvciAoaW50IGo9YnM7IGo8PWJlOyBqKyspIGlmIChhW2FzXT09YltqXSkKICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcoMSwgYVthc10pOwogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQogICAgICAgIGludCBhbWlkPShhcythZSkvMjsKICAgICAgICBhdXRvIEwxPXByZWYoYSwgYXMsIGFtaWQsIGIsIGJzLCBiZSk7CiAgICAgICAgYXV0byBMMj1zdWZmKGEsIGFtaWQrMSwgYWUsIGIsIGJzLCBiZSk7CiAgICAgICAgaW50IGJlc3Q9LTEsIGJqPTA7CiAgICAgICAgZm9yIChpbnQgaj0wOyBqPD1iZS1icysxOyBqKyspIHsKICAgICAgICAgICAgaW50IGM9TDFbal0rTDJbYmUtYnMrMS1qXTsKICAgICAgICAgICAgaWYgKGM+YmVzdCkKICAgICAgICAgICAgICAgIGJlc3Q9YywgYmo9ajsKICAgICAgICB9CiAgICAgICAgc3RyaW5nIGw9bGNzKGEsIGIsIGFzLCBhbWlkLCBicywgYnMrYmotMSk7CiAgICAgICAgc3RyaW5nIHI9bGNzKGEsIGIsIGFtaWQrMSwgYWUsIGJzK2JqLCBiZSk7CiAgICAgICAgcmV0dXJuIGwrcjsKICAgIH0KICAgIC8vIC0tLSBvcGVuIEFQSSAtLS0KICAgIHN0YXRpYyBwYWlyPGludCwgc3RyaW5nPiBydW4oc3RyaW5nJiBhLCBzdHJpbmcmIGIpIHsKICAgICAgICBpZiAoYS5lbXB0eSgpIHx8IGIuZW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIHswLCIifTsKICAgICAgICBzdHJpbmcgcz1sY3MoYSwgYiwgMCwgYS5zaXplKCktMSwgMCwgYi5zaXplKCktMSk7CiAgICAgICAgcmV0dXJuIHtzLnNpemUoKSwgc307CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIGNpbi50aWUoMCktPnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIHN0cmluZyBhLCBiOwogICAgY2luID4+IGEgPj4gYjsKICAgIGF1dG8gW2xlbiwgc109TENTOjpydW4oYSwgYik7CiAgICBjb3V0IDw8IGxlbiA8PCAnXG4nIDw8IHM7Cn0=