#include using namespace std; int n, w; vector a; vector l; // refactored this into an extra method... // we do not need to compute go every time int getH() { for (int h = 1; h < n; h++) { vector dp(n+1, INT_MAX); dp[n] = 0; for (int i = n-1; i >= 0; i--) { int m = 0; for (int j = i; j < min(i+h,n); j++) { m = max(m, l[j]); dp[i] = min(dp[i], m+dp[j+1]); } } if (dp[0] <= w+1) return h; } return n; } int main() { cin >> n >> w; a.assign(n, ""); l.assign(n, 0); for (int i = 0; i < n; i++) { cin >> a[i]; l[i] = size(a[i]) + 1; } int h = getH(); vector dp(n+1, INT_MAX), go(n+1); dp[n] = 0; for (int i = n-1; i >= 0; i--) { int m = 0; for (int j = i; j < min(i+h,n); j++) { m = max(m, l[j]); if (m+dp[j+1] < dp[i]) { dp[i] = m+dp[j+1], go[i] = j+1; } } } vector b(h, string(w,' ')); vector c; int k = 0; for (int i = 0; i < n; i = go[i]) { int m = 0; for (int j = i; j < go[i]; j++) { m = max(m, l[j]); copy(begin(a[j]), end(a[j]), begin(b[j-i])+k); } k += m; c.push_back(m-1); } cout << h << " " << size(c) << endl; for (int k: c) cout << k << " "; cout << endl; for (string s: b) cout << s << endl; }