#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<int> countPrefixLen(const vector<string>& words) {
int n = words.size();
vector<int> prefixLen(n+1);
for (int i = 1; i <= n; ++i) {
prefixLen[i] = prefixLen[i-1] + words[i-1].length();
}
return prefixLen;
}
void output(int answer, const vector<int>& best, const vector<string>& words) {
cout << answer << endl;
int j = best.size()-1;
vector<int> restoreIndex(1, j);
while (j > 0) {
int i = best[j];
restoreIndex.push_back(i);
j = i;
}
reverse(restoreIndex.begin(), restoreIndex.end());
for (int i = 0; i+1 < restoreIndex.size(); ++i) {
for (int j = restoreIndex[i]; j < restoreIndex[i+1]; ++j) {
cout << words[j] << ' ';
}
cout << endl;
}
}
int main() {
const vector<string> words = {"would", "a", "cat", "eat", "a", "mouse"};
const int L = 5;
int n = words.size();
vector<int> prefixLen = countPrefixLen(words);
vector<int> f(n+1);
vector<int> best(n+1, -1);
int maxL = prefixLen[n];
f[0] = 0;
for (int i = 1; i <= n; ++i) {
f[i] = maxL;
for (int j = 0; j < i; ++j) {
int totalLen = prefixLen[i] - prefixLen[j];
if (totalLen >= L) {
int maxLen = max(f[j], totalLen);
if (f[i] > maxLen) {
f[i] = maxLen;
best[i] = j;
}
}
}
}
output(f[n], best, words);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3RvcjxpbnQ+IGNvdW50UHJlZml4TGVuKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB3b3JkcykgewoJaW50IG4gPSB3b3Jkcy5zaXplKCk7Cgl2ZWN0b3I8aW50PiBwcmVmaXhMZW4obisxKTsKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewoJCXByZWZpeExlbltpXSA9IHByZWZpeExlbltpLTFdICsgd29yZHNbaS0xXS5sZW5ndGgoKTsKCX0gCglyZXR1cm4gcHJlZml4TGVuOwp9Cgp2b2lkIG91dHB1dChpbnQgYW5zd2VyLCBjb25zdCB2ZWN0b3I8aW50PiYgYmVzdCwgY29uc3QgdmVjdG9yPHN0cmluZz4mIHdvcmRzKSB7Cgljb3V0IDw8IGFuc3dlciA8PCBlbmRsOwoJCglpbnQgaiA9IGJlc3Quc2l6ZSgpLTE7Cgl2ZWN0b3I8aW50PiByZXN0b3JlSW5kZXgoMSwgaik7Cgl3aGlsZSAoaiA+IDApIHsKCQlpbnQgaSA9IGJlc3Rbal07CgkJcmVzdG9yZUluZGV4LnB1c2hfYmFjayhpKTsKCQlqID0gaTsKCX0KCXJldmVyc2UocmVzdG9yZUluZGV4LmJlZ2luKCksIHJlc3RvcmVJbmRleC5lbmQoKSk7Cglmb3IgKGludCBpID0gMDsgaSsxIDwgcmVzdG9yZUluZGV4LnNpemUoKTsgKytpKSB7CgkJZm9yIChpbnQgaiA9IHJlc3RvcmVJbmRleFtpXTsgaiA8IHJlc3RvcmVJbmRleFtpKzFdOyArK2opIHsKCQkJY291dCA8PCB3b3Jkc1tqXSA8PCAnICc7CgkJfQoJCWNvdXQgPDwgZW5kbDsKCX0KCn0KCmludCBtYWluKCkgewoJY29uc3QgdmVjdG9yPHN0cmluZz4gd29yZHMgPSB7IndvdWxkIiwgImEiLCAiY2F0IiwgImVhdCIsICJhIiwgIm1vdXNlIn07Cgljb25zdCBpbnQgTCA9IDU7CglpbnQgbiA9IHdvcmRzLnNpemUoKTsKCQoJdmVjdG9yPGludD4gcHJlZml4TGVuID0gY291bnRQcmVmaXhMZW4od29yZHMpOwoJCgl2ZWN0b3I8aW50PiBmKG4rMSk7Cgl2ZWN0b3I8aW50PiBiZXN0KG4rMSwgLTEpOwoJaW50IG1heEwgPSBwcmVmaXhMZW5bbl07CglmWzBdID0gMDsKCQoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CgkJZltpXSA9IG1heEw7IAoJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CgkJCWludCB0b3RhbExlbiA9IHByZWZpeExlbltpXSAtIHByZWZpeExlbltqXTsKCQkJaWYgKHRvdGFsTGVuID49IEwpIHsKCQkJCWludCBtYXhMZW4gPSBtYXgoZltqXSwgdG90YWxMZW4pOwoJCQkJaWYgKGZbaV0gPiBtYXhMZW4pIHsKCQkJCQlmW2ldID0gbWF4TGVuOwoJCQkJCWJlc3RbaV0gPSBqOwoJCQkJfQoJCQl9CgkJfSAKCX0KCQoJb3V0cHV0KGZbbl0sIGJlc3QsIHdvcmRzKTsJCglyZXR1cm4gMDsKfQ==