#include #include #include #include #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; int evaluate(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; } return sum; } int main() { int tmp, curr, currV, iter, runs; 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) < 15000000) { for (i = 0; i < (1 << n); ++i) { evaluate(i); } } else { srand(time(0)); for (runs = 0; runs < 7000000; ++runs) { curr = (rand() ^ (rand() << 16)) & ((1 << n) - 1); currV = evaluate(curr); for (iter = 0; iter < 10; ++iter) { int next = curr ^ (1 << (rand() % n)); int nextV = currV; if (currV <= nextV) { currV = nextV; curr = next; } } } } 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; }