#include #include using namespace std; int n,w; int mins[5005][5005], howmany[5005][5005], maxwlen[5005][5005]; string words[5005]; char terminal[5005][5005]; vector nums_per_col, widths_per_col; int rec(int pos, int left) { if (pos >= n) return 0; if (left <= 0 or maxwlen[pos][n] > left) return n; if (mins[pos][left] >= 0) return mins[pos][left]; int best = n - pos; howmany[pos][left] = best; for (int i = pos + 1; i < n; i++) { int split = max(i-pos, rec(i, left - maxwlen[pos][i] - 1)); if (split < best) { best = split; howmany[pos][left] = i-pos; } } return mins[pos][left] = best; } int main() { cin >> n >> w; for (int i = 0; i < n; i++) { cin >> words[i]; for (int y = 0; y <= w; y++) mins[i][y] = -1; } for (int f = 0; f <= n; f++) { maxwlen[f][f+1] = words[f].length(); for (int t = f + 1; t <= n; t++) maxwlen[f][t+1] = max(maxwlen[f][t], (int)words[t].length()); } int best = rec(0, w); int curword = 0, pos = 0, left = w; for (int i = 0; i < best; i++) for (int j = 0; j < w; j++) terminal[i][j] = ' '; while (pos < n) { int numWords = howmany[pos][left]; for (int row = 0; row < numWords; row++) { for (int x = 0; x < words[curword].length(); x++) terminal[row][w-left + x] = words[curword][x]; curword++; } nums_per_col.push_back(numWords); int colWidth = maxwlen[pos][pos+numWords]; widths_per_col.push_back(colWidth); pos += numWords; left -= (colWidth + 1); } cout << best << ' ' << nums_per_col.size() << endl; for (auto width : widths_per_col) cout << width << " "; cout << endl; for (int i = 0; i < best; i++) { for (int col = 0; col < w; col++) cout << terminal[i][col]; cout << endl; } }