#include <bits/stdc++.h>
using namespace std;
struct TLSTValue {
int len;
int cnt;
};
void update(TLSTValue& v, const TLSTValue& u) {
if (u.cnt == 0) {
return;
}
if (u.len > v.len) {
v.len = u.len;
v.cnt = u.cnt;
} else if (u.len == v.len) {
v.cnt += u.cnt;
}
}
int main(int /* argc */, char** /* argv */)
{
string a, b;
while (cin >> a >> b) {
int n = a.size();
int m = b.size();
vector<vector<int>> nxt(n, vector<int>(m));
for (int j = 0; j < m; ++j) {
int lst = n;
for (int i = n - 1; i >= 0; --i) {
if (a[i] == b[j]) {
lst = i;
}
nxt[i][j] = lst;
}
}
vector<vector<TLSTValue>> f(n + 1, vector<TLSTValue>(m + 1, {0, 0}));
f[0][0]= {0, 1};
TLSTValue ans = {0, 0};
for (int i = 0; i <= n; ++i) {
unordered_set<char> st;
for (int j = 0; j <= m; ++j) {
update(ans, f[i][j]);
if (j) {
update(f[i][j], f[i][j - 1]);
}
if (st.count(b[j])) {
continue;
}
st.insert(b[j]);
if (i < n && j < m && f[i][j].cnt && nxt[i][j] < n) {
update(f[nxt[i][j] + 1][j + 1], {f[i][j].len + 1, f[i][j].cnt});
}
}
}
cout << a << " and " << b << ": length = " << ans.len << ", count = " << ans.cnt << endl;
}
cerr << "Time execute: " << clock() / (double)CLOCKS_PER_SEC << " sec" << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnN0cnVjdCBUTFNUVmFsdWUgewogICAgaW50IGxlbjsKICAgIGludCBjbnQ7Cn07CgoKdm9pZCB1cGRhdGUoVExTVFZhbHVlJiB2LCBjb25zdCBUTFNUVmFsdWUmIHUpIHsKICAgIGlmICh1LmNudCA9PSAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHUubGVuID4gdi5sZW4pIHsKICAgICAgICB2LmxlbiA9IHUubGVuOwogICAgICAgIHYuY250ID0gdS5jbnQ7CiAgICB9IGVsc2UgaWYgKHUubGVuID09IHYubGVuKSB7CiAgICAgICAgdi5jbnQgKz0gdS5jbnQ7CiAgICB9Cn0KCmludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykKewogICAgc3RyaW5nIGEsIGI7CiAgICB3aGlsZSAoY2luID4+IGEgPj4gYikgewogICAgICAgIGludCBuID0gYS5zaXplKCk7CiAgICAgICAgaW50IG0gPSBiLnNpemUoKTsKCiAgICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBueHQobiwgdmVjdG9yPGludD4obSkpOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICAgIGludCBsc3QgPSBuOwogICAgICAgICAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICAgICAgICBpZiAoYVtpXSA9PSBiW2pdKSB7CiAgICAgICAgICAgICAgICAgICAgbHN0ID0gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG54dFtpXVtqXSA9IGxzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmVjdG9yPHZlY3RvcjxUTFNUVmFsdWU+PiBmKG4gKyAxLCB2ZWN0b3I8VExTVFZhbHVlPihtICsgMSwgezAsIDB9KSk7CiAgICAgICAgZlswXVswXT0gezAsIDF9OwogICAgICAgIFRMU1RWYWx1ZSBhbnMgPSB7MCwgMH07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgICAgIHVub3JkZXJlZF9zZXQ8Y2hhcj4gc3Q7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IG07ICsraikgewogICAgICAgICAgICAgICAgdXBkYXRlKGFucywgZltpXVtqXSk7CiAgICAgICAgICAgICAgICBpZiAoaikgewogICAgICAgICAgICAgICAgICAgIHVwZGF0ZShmW2ldW2pdLCBmW2ldW2ogLSAxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3QuY291bnQoYltqXSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0Lmluc2VydChiW2pdKTsKICAgICAgICAgICAgICAgIGlmIChpIDwgbiAmJiBqIDwgbSAmJiBmW2ldW2pdLmNudCAmJiBueHRbaV1bal0gPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlKGZbbnh0W2ldW2pdICsgMV1baiArIDFdLCB7ZltpXVtqXS5sZW4gKyAxLCBmW2ldW2pdLmNudH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgYSA8PCAiIGFuZCAiIDw8IGIgPDwgIjogbGVuZ3RoID0gIiA8PCBhbnMubGVuIDw8ICIsIGNvdW50ID0gIiA8PCBhbnMuY250IDw8IGVuZGw7CiAgICB9CgogICAgY2VyciA8PCAiVGltZSBleGVjdXRlOiAiIDw8IGNsb2NrKCkgLyAoZG91YmxlKUNMT0NLU19QRVJfU0VDIDw8ICIgc2VjIiA8PCBlbmRsOwogICAgcmV0dXJuIDA7Cn0K
ABC and AB: length = 2, count = 1
BCAB and ABC: length = 2, count = 2
A and AAA: length = 1, count = 1
AAA and A: length = 1, count = 1
AAAB and ABBB: length = 2, count = 1
ABBB and AAAB: length = 2, count = 1
Time execute: 0.002938 sec