#include #include #include #include #include #define ITERATIONS 17000000 #define MAXN 30 #define scanf_1(a, b) { if (1 != scanf((a), (b))) return 1; } #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) int n; int d[MAXN][MAXN]; char str[MAXN + 1]; int i, j; int cnt; int answer, answerMask; void update(int mask) { int i, j, m, mm, sum = 0; m = mask; while (m) { int i = __builtin_ctz(m); mm = m; m ^= 1 << i; while (mm) { int j = __builtin_ctz(mm); mm ^= 1 << j; sum += d[i][j]; } } if (answer < sum) { answer = sum; answerMask = mask; } } int main() { int tmp; scanf_1("%s", str); n = strlen(str); for (i = 0; i < n; ++i) { for (j = i; j < n; ++j) { scanf_1("%d", &d[i][j]); } } if ((1 << n) < ITERATIONS) { for (i = 0; i < (1 << n); ++i) { update(i); } } else { std::mt19937 rng(time(0)); for (i = 0; i < ITERATIONS; ++i) { int v = rng() & ((1 << n) - 1); update(v); } } tmp = answerMask; while (tmp) { cnt += tmp & 1; tmp >>= 1; } printf("%d\n", cnt); for (i = 0; i < n; ++i, answerMask >>= 1) { if (answerMask & 1) { printf("%c", str[i]); } } if (answer != 0) { printf("\n"); } return 0; }