#include #include #include #include #define MAXN 5001 #define MAXW 5001 #define rep(E, F) for (E = 0; E < (F); E++) #define per(E, F) for (E = (F) - 1; E >= 0; E--) int min(int a, int b) { if (a > b) return b; return a; } int max(int a, int b) { if (a < b) return b; return a; } int get_int() { int r = 0, c = getchar(), s = 1; while (c != '-' && c < '0' || c > '9') c = getchar(); while (c == '-') s *= -1, c = getchar(); while (c >= '0' && c <= '9') r = r*10 + c - '0', c = getchar(); return s*r; } int get_string(char* b, char t) { int i = 0; b[i++] = getchar(); while (b[i - 1] != t) b[i++] = getchar(); b[i - 1] = '\0'; return i - 1; } int n, w, a[MAXN], d[MAXN], e[MAXN], h; int foo(int x) { // find the minumum width with height h. if (x > n) return 1 << 30; if (x == n) return 0; if (d[x] != -1) return d[x]; int i, mx = 0; d[x] = 1 << 30; rep(i, h) { // the column may have up to h elements if (x + i >= n) break; mx = max(mx, a[x + i]); int z = 1 + mx + foo(x + i + 1); if (z < d[x]) d[x] = z, e[x] = x + i + 1; } return d[x]; } void padded_print(char *s, int n) { int i, m = strlen(s); assert(m < n); printf("%s", s); rep(i, n - m) putchar(' '); } int main() { int i, j; n = get_int(), w = get_int(); char b[10*n][w + 1]; rep(i, n) a[i] = get_string(b[i], 10); int r = 1, s = n + 1, f = 0; while (r < s) { h = (r + s)/2; if (s - r < 5) h = r, f = 1; rep(i, n + 1) d[i] = -1; int v = foo(0) - 1; if (v <= w) s = h + 1; else r = h; if (f && v <= w) s = r; else if (f) r++; } h = r; rep(i, n + 1) d[i] = -1; rep(i, n + 1) foo(i); char *g[n]; int z = 0, mxs[n], hh[n]; rep(i, n) mxs[i] = hh[i] = 0, g[i] = NULL; i = 0; while (i < n) hh[z] = e[i] - i, g[z++] = &b[i][0], i = e[i]; int zz = 0, k = 0; rep(i, n) { if (k == hh[zz]) zz++, k = 0; mxs[zz] = max(mxs[zz], a[i]); k++; } rep(i, z) assert(hh[i] <= h); printf("%d %d\n", h, z); rep(i, z) printf("%d ", mxs[i]); printf("\n"); rep(i, h) { rep(j, z) padded_print(i >= hh[j] ? "" : &(g[j][i*(w + 1)]), mxs[j] + 1); printf("\n"); } return 0; }