#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 s[MAXN], d[MAXN][MAXN]; char str[MAXN + 1]; int i, j, tmp; int cnt; int answer, answerMask; void go(int index, int cur, int curMask) { if (index == n) { if (answer < cur) { answer = cur; answerMask = curMask; } } else { go(index + 1, cur, curMask); for (i = 0; i < n; ++i) { s[i] += d[index][i]; } cur = 0; curMask ^= (1 << index); for (i = 0; i < n; ++i) { if ((curMask & (1 << i)) != 0) { cur += s[i]; } } go(index + 1, cur, curMask); for (i = 0; i < n; ++i) { s[i] -= d[index][i]; } } } int main() { 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]); } } go(0, 0, 0); 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; }