#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 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()); } for (int left = 0; left <= w; left++) { for (int pos = n-1; pos >= 0; pos--) { if (left == 0 or maxwlen[pos][n] > left) mins[pos][left] = n; else { int best = n - pos; howmany[pos][left] = best; for (int i = pos + 1; i < n; i++) { if (left - maxwlen[pos][i] - 1 > 0) { int split = max(i-pos, mins[i][left - maxwlen[pos][i] - 1]); if (split < best) { best = split; howmany[pos][left] = i-pos; } } } mins[pos][left] = best; } } } int best = mins[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; } }