#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
typedef long long ll;
typedef pair <int, int> ii;
typedef pair <char, ll> pll;
const int INF = 0x3f3f3f3f;
const int N = (int) 25e2 + 5;
vector <pll> decode(string s) {
vector <pll> res;
int i = 0;
while (i < (int)s.size()) {
res.push_back({s[i], 0});
i++;
while (i < (int)s.size()) {
if (isdigit(s[i]))
res.back().s = res.back().s * 10 + s[i] - '0';
else
break;
i++;
}
}
return res;
}
ll f[N][N];
ll pre_x[N][26], pre_y[N][26];
ll prev_x[N][26], prev_y[N][26];
bool check(int i, int j, int cur_i, int cur_j, char c) {
int cnt_x = pre_x[cur_i][c - 'a'] - pre_x[i][c - 'a'];
int cnt_y = pre_y[cur_j][c - 'a'] - pre_y[j][c - 'a'];
return (cnt_x <= cnt_y);
}
ii find(vector <pll> x, vector <pll> y, int cur_i, int cur_j, char c) {
ii res = {0, 0};
for (int i = cur_i - 1; i >= 1; i--) {
int j = prev_y[cur_j][x[i - 1].f - 'a'];
if (j == INF) break;
if (check(i, j, cur_i, cur_j, c)) {
res = {i, j};
return res;
}
}
for (int j = cur_j - 1; j >= 1; j--) {
int i = prev_x[cur_i][y[j - 1].f - 'a'];
if (i == INF) break;
if (!check(i, j, cur_i, cur_j, c)) {
res = {i, j};
return res;
}
}
return res;
}
void precompute(vector <pll> x, vector <pll> y, int n, int m) {
for (char c = 'a'; c <= 'z'; c++) {
for (int i = 0; i < n; i++)
pre_x[i + 1][c - 'a'] = pre_x[i][c - 'a'] + (x[i].f == c ? x[i].s : 0);
for (int j = 0; j < m; j++)
pre_y[j + 1][c - 'a'] = pre_y[j][c - 'a'] + (y[j].f == c ? y[j].s : 0);
}
memset(prev_x, INF, sizeof prev_x);
memset(prev_y, INF, sizeof prev_y);
for (int i = 1; i <= n; i++) {
for (char c = 'a'; c <= 'z'; c++) {
prev_x[i][c - 'a'] = prev_x[i - 1][c - 'a'];
prev_x[i + 1][x[i - 1].f - 'a'] = i;
}
}
for (int i = 1; i <= m; i++) {
for (char c = 'a'; c <= 'z'; c++) {
prev_y[i][c - 'a'] = prev_y[i - 1][c - 'a'];
prev_y[i + 1][y[i - 1].f - 'a'] = i;
}
}
}
ll LCS1(vector <pll> x, vector <pll> y) {
int n = (int)x.size();
int m = (int)y.size();
precompute(x, y, n, m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (x[i - 1].f == y[j - 1].f) {
char c = x[i - 1].f;
ii pos = find(x, y, i, j, c);
ll cnt_x = pre_x[i][c - 'a'] - pre_x[pos.f][c - 'a'];
ll cnt_y = pre_y[j][c - 'a'] - pre_y[pos.s][c - 'a'];
f[i][j] = f[pos.f][pos.s] + min(cnt_x, cnt_y);
}
}
}
return f[n][m];
}
ll g[N][N];
ll LCS2(vector <pll> x, vector <pll> y) {
int n = (int)x.size();
int m = (int)y.size();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (x[i - 1].f != y[j - 1].f)
g[i][j] = 0;
else
g[i][j] = min(x[i - 1].s, y[j - 1].s) + g[i - 1][j - 1];
}
}
ll ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) ans = max(ans, g[i][j]);
}
return ans;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
string a, b;
cin >> a >> b;
vector <pll> x = decode(a);
vector <pll> y = decode(b);
cout << LCS1(x, y) << "\n";
cout << LCS2(x, y) << "\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGYgZmlyc3QKI2RlZmluZSBzIHNlY29uZAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7IAp0eXBlZGVmIHBhaXIgPGludCwgaW50PiBpaTsgCnR5cGVkZWYgcGFpciA8Y2hhciwgbGw+IHBsbDsgCgpjb25zdCBpbnQgSU5GID0gMHgzZjNmM2YzZjsgCmNvbnN0IGludCBOID0gKGludCkgMjVlMiArIDU7IAoKdmVjdG9yIDxwbGw+IGRlY29kZShzdHJpbmcgcykgewoJdmVjdG9yIDxwbGw+IHJlczsgCglpbnQgaSA9IDA7IAoJCgl3aGlsZSAoaSA8IChpbnQpcy5zaXplKCkpIHsKCQlyZXMucHVzaF9iYWNrKHtzW2ldLCAwfSk7IAoJCQoJCWkrKzsgCgkJCgkJd2hpbGUgKGkgPCAoaW50KXMuc2l6ZSgpKSB7CgkJCWlmIChpc2RpZ2l0KHNbaV0pKSAKCQkJCXJlcy5iYWNrKCkucyA9IHJlcy5iYWNrKCkucyAqIDEwICsgc1tpXSAtICcwJzsgCgkJCWVsc2UgCgkJCQlicmVhazsgCgkJCQoJCQlpKys7IAoJCX0KCX0KCQoJcmV0dXJuIHJlczsgCn0KCmxsIGZbTl1bTl07IApsbCBwcmVfeFtOXVsyNl0sIHByZV95W05dWzI2XTsgCmxsIHByZXZfeFtOXVsyNl0sIHByZXZfeVtOXVsyNl07IAoKYm9vbCBjaGVjayhpbnQgaSwgaW50IGosIGludCBjdXJfaSwgaW50IGN1cl9qLCBjaGFyIGMpIHsKCWludCBjbnRfeCA9IHByZV94W2N1cl9pXVtjIC0gJ2EnXSAtIHByZV94W2ldW2MgLSAnYSddOyAKCWludCBjbnRfeSA9IHByZV95W2N1cl9qXVtjIC0gJ2EnXSAtIHByZV95W2pdW2MgLSAnYSddOyAKCQoJcmV0dXJuIChjbnRfeCA8PSBjbnRfeSk7IAp9CgppaSBmaW5kKHZlY3RvciA8cGxsPiB4LCB2ZWN0b3IgPHBsbD4geSwgaW50IGN1cl9pLCBpbnQgY3VyX2osIGNoYXIgYykgewoJaWkgcmVzID0gezAsIDB9OwoJCglmb3IgKGludCBpID0gY3VyX2kgLSAxOyBpID49IDE7IGktLSkgewoJCWludCBqID0gcHJldl95W2N1cl9qXVt4W2kgLSAxXS5mIC0gJ2EnXTsgCgkJCgkJaWYgKGogPT0gSU5GKSBicmVhazsgCgkJCgkJaWYgKGNoZWNrKGksIGosIGN1cl9pLCBjdXJfaiwgYykpIHsKCQkJcmVzID0ge2ksIGp9OyAKCQkJCgkJCXJldHVybiByZXM7IAoJCX0JCSAgIAkKCX0gCgkKCWZvciAoaW50IGogPSBjdXJfaiAtIDE7IGogPj0gMTsgai0tKSB7CgkJaW50IGkgPSBwcmV2X3hbY3VyX2ldW3lbaiAtIDFdLmYgLSAnYSddOyAKCQkKCQlpZiAoaSA9PSBJTkYpIGJyZWFrOyAKCQkKCQlpZiAoIWNoZWNrKGksIGosIGN1cl9pLCBjdXJfaiwgYykpIHsKCQkJcmVzID0ge2ksIGp9OyAKCQkJCgkJCXJldHVybiByZXM7IAoJCX0KCX0KCQoJcmV0dXJuIHJlczsgCn0KCnZvaWQgcHJlY29tcHV0ZSh2ZWN0b3IgPHBsbD4geCwgdmVjdG9yIDxwbGw+IHksIGludCBuLCBpbnQgbSkgewoJZm9yIChjaGFyIGMgPSAnYSc7IGMgPD0gJ3onOyBjKyspIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCQkJcHJlX3hbaSArIDFdW2MgLSAnYSddID0gcHJlX3hbaV1bYyAtICdhJ10gKyAoeFtpXS5mID09IGMgPyB4W2ldLnMgOiAwKTsgICAKCQkKCQlmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgCgkJCXByZV95W2ogKyAxXVtjIC0gJ2EnXSA9IHByZV95W2pdW2MgLSAnYSddICsgKHlbal0uZiA9PSBjID8geVtqXS5zIDogMCk7IAoJfQoJCgltZW1zZXQocHJldl94LCBJTkYsIHNpemVvZiBwcmV2X3gpOyAKCW1lbXNldChwcmV2X3ksIElORiwgc2l6ZW9mIHByZXZfeSk7IAoJCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQlmb3IgKGNoYXIgYyA9ICdhJzsgYyA8PSAneic7IGMrKykgewoJCQlwcmV2X3hbaV1bYyAtICdhJ10gPSBwcmV2X3hbaSAtIDFdW2MgLSAnYSddOyAKCQkJCgkJCXByZXZfeFtpICsgMV1beFtpIC0gMV0uZiAtICdhJ10gPSBpOyAKCQl9Cgl9CgkKCWZvciAoaW50IGkgPSAxOyBpIDw9IG07IGkrKykgewoJCWZvciAoY2hhciBjID0gJ2EnOyBjIDw9ICd6JzsgYysrKSB7CgkJCXByZXZfeVtpXVtjIC0gJ2EnXSA9IHByZXZfeVtpIC0gMV1bYyAtICdhJ107IAoJCQkKCQkJcHJldl95W2kgKyAxXVt5W2kgLSAxXS5mIC0gJ2EnXSA9IGk7IAoJCX0KCX0KfQoKbGwgTENTMSh2ZWN0b3IgPHBsbD4geCwgdmVjdG9yIDxwbGw+IHkpIHsKCWludCBuID0gKGludCl4LnNpemUoKTsgCglpbnQgbSA9IChpbnQpeS5zaXplKCk7IAoJCglwcmVjb21wdXRlKHgsIHksIG4sIG0pOyAKCQoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDE7IGogPD0gbTsgaisrKSB7CgkJCWlmICh4W2kgLSAxXS5mID09IHlbaiAtIDFdLmYpIHsKCQkJCWNoYXIgYyA9IHhbaSAtIDFdLmY7IAoJCQkJCgkJCQlpaSBwb3MgPSBmaW5kKHgsIHksIGksIGosIGMpOyAKCQkJCQoJCQkJbGwgY250X3ggPSBwcmVfeFtpXVtjIC0gJ2EnXSAtIHByZV94W3Bvcy5mXVtjIC0gJ2EnXTsKCQkJCWxsIGNudF95ID0gcHJlX3lbal1bYyAtICdhJ10gLSBwcmVfeVtwb3Muc11bYyAtICdhJ107IAoJCQkJCQkJCgkJCQlmW2ldW2pdID0gZltwb3MuZl1bcG9zLnNdICsgbWluKGNudF94LCBjbnRfeSk7ICAKCQkJfQoJCX0KCX0KCQoJcmV0dXJuIGZbbl1bbV07ICAKfQoKbGwgZ1tOXVtOXTsgCgpsbCBMQ1MyKHZlY3RvciA8cGxsPiB4LCB2ZWN0b3IgPHBsbD4geSkgewoJaW50IG4gPSAoaW50KXguc2l6ZSgpOyAKCWludCBtID0gKGludCl5LnNpemUoKTsgCgkKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWZvciAoaW50IGogPSAxOyBqIDw9IG07IGorKykgewoJCQlpZiAoeFtpIC0gMV0uZiAhPSB5W2ogLSAxXS5mKSAKCQkJCWdbaV1bal0gPSAwOyAKCQkJZWxzZSAKCQkJCWdbaV1bal0gPSBtaW4oeFtpIC0gMV0ucywgeVtqIC0gMV0ucykgKyBnW2kgLSAxXVtqIC0gMV07IAoJCX0KCX0JCgkKCWxsIGFucyA9IDA7IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDE7IGogPD0gbTsgaisrKSBhbnMgPSBtYXgoYW5zLCBnW2ldW2pdKTsgCgl9CgkKCXJldHVybiBhbnM7IAp9CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKCXN0cmluZyBhLCBiOyAKCWNpbiA+PiBhID4+IGI7IAoKCXZlY3RvciA8cGxsPiB4ID0gZGVjb2RlKGEpOyAKCXZlY3RvciA8cGxsPiB5ID0gZGVjb2RlKGIpOyAKCQkKCWNvdXQgPDwgTENTMSh4LCB5KSA8PCAiXG4iOyAKCWNvdXQgPDwgTENTMih4LCB5KSA8PCAiXG4iOyAKfQo=