#include using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; int smax(int & x, int y) { if (x < y) { x = y; return true; } return false; } int smin(int & x, int y) { if (x > y) { x = y; return true; } return false; } const int mod = 998244353; int sum(int x, int y) { if (x + y >= mod) { return x + y - mod; } return x + y; } int mult(int x, int y) { return (int) ((x * 1LL * y) % mod); } int mypow(int x, int p) { int ans = 1; while (p > 0) { if ((p & 1) == 1) { ans = mult(ans, x); } x = mult(x, x); p >>= 1; } return ans; } int inv(int x) { return mypow(x, mod - 2); } template struct SegmentTree { int pow; T neutral; vector seg; vector delta; SegmentTree(vector a, T n) { neutral = n; pow = 1; while (pow <= (int)a.size()) { pow *= 2; } seg.resize(2 * pow); delta.resize(2 * pow, 0); for (int i = 0; i < (int) a.size(); ++i) { seg[pow + i] = a[i]; } for (int i = a.size(); i < pow; ++i) { seg[pow + i] = neutral; } for (int i = pow - 1; i > 0; --i) { seg[i] = f(seg[2 * i], seg[2 * i + 1]); } } void push(int v) { if (v < pow) { delta[2 * v] += delta[v]; delta[2 * v + 1] += delta[v]; seg[v] = f(seg[2 * v] + delta[2 * v], seg[2 * v + 1] + delta[2 * v + 1]); } else { seg[v] += delta[v]; } delta[v] = 0; } T get(int l, int r) { return get(1, 0, pow, l, r); } T get(int v, int tl, int tr, int l, int r) { push(v); // cerr << "get " << v << " " << tl << " " << tr << " " << l << " " << r << " " << seg[v] << "\n"; if (l >= tr || r <= tl) { return neutral; } if (l <= tl && tr <= r) { return seg[v]; } int tm = (tl + tr) / 2; return f(get(2 * v, tl, tm, l, r), get(2 * v + 1, tm, tr, l, r)); } void set(int x, int value) { set(1, 0, pow, x, value); } void set(int v, int tl, int tr, int x, int value) { push(v); if (v >= pow) { seg[v] = value; delta[v] = 0; return; } int tm = (tl + tr) / 2; if (x < tm) { set(2 * v, tl, tm, x, value); push(2 * v + 1); } else { push(2 * v); set (2 * v + 1, tm, tr, x, value); } seg[v] = f(seg[2 * v] + delta[2 * v], seg[2 * v + 1] + delta[2 * v + 1]); } void add(int l, int r, int d) { add(1, 0, pow, l, r, d); } void add(int v, int tl, int tr, int l, int r, int d) { push(v); // cerr << "add " << tl << " " << tr << " " << l << " " << r << " " << d << "\n"; if (l >= tr || r <= tl) { return; } if (l <= tl && tr <= r) { delta[v] += d; return; } int tm = (tl + tr) / 2; add(2 * v, tl, tm, l, r, d); add(2 * v + 1, tm, tr, l, r, d); seg[v] = f(seg[2 * v] + delta[2 * v], seg[2 * v + 1] + delta[2 * v + 1]); delta[v] = 0; } T f(T a, T b) { return min(a, b); } }; void solve() { string s; cin >> s; int n; n = 30; n = s.size(); vector> score(n, vector(n)); for (int i = 0; i < n; ++i) { for (int j = i; j < n; ++j) { cin >> score[i][j]; } } int ans = 0; int best = 0; if (n == 1) { if (score[0][0] <= 0) { cout << "0\n\n"; } else { cout << score[0][0] << "\n"; cout << s << "\n"; } return; } int m1 = n / 2; int p1 = 1 << m1; int m2 = n - m1; int p2 = 1 << m2; vector sc1(p1); vector sc2(p2); for (int mask1 = 0; mask1 < p1; ++mask1) { for (int i = 0; i < m1; ++i) { if (((mask1 >> i) & 1) == 0) { continue; } for (int j = i; j < m1; ++j) { if (((mask1 >> j) & 1) == 0) { continue; } sc1[mask1] += score[i][j]; } } } for (int mask2 = 0; mask2 < p2; ++mask2) { for (int i = 0; i < m2; ++i) { if (((mask2 >> i) & 1) == 0) { continue; } for (int j = i; j < m2; ++j) { if (((mask2 >> j) & 1) == 0) { continue; } sc2[mask2] += score[m1 + i][m1 + j]; } } } vector lastBit(p2); for (int i = 1; i < p2; ++i) { int x = i; int cur = 0; while (x % 2 == 0) { ++cur; x /= 2; } lastBit[i] = cur; } vector a(m2); vector res(p2); int bit = -1; for (int mask1 = 0; mask1 < p1; ++mask1) { for (int i = 0; i < m2; ++i) { a[i] = 0; for (int j = 0; j < m1; ++j) { if (((mask1 >> j) & 1) == 0) { continue; } a[i] += score[j][m1 + i]; } } if (smax(ans, sc1[mask1])) { best = mask1; } for (int mask2 = 1; mask2 < p2; ++mask2) { bit = lastBit[mask2]; res[mask2] = res[mask2 ^ (1 << bit)] + a[bit]; if (smax(ans, sc1[mask1] + sc2[mask2] + res[mask2])) { best = mask1 + (mask2 << m1); } } } cout << __builtin_popcount(best) << "\n"; for (int i = 0; i < n; ++i) { if (((best >> i) & 1) == 1) { cout << s[i]; } } cout << "\n"; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; // cin >> t; while (t--) { solve(); } cerr << "Time " << clock() * 1. / CLOCKS_PER_SEC << "\n"; return 0; }