Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<vector>
- #include<algorithm>
- #include<string>
- using namespace std;
- #define sq(x) (x)*(x)*(x)
- const int INF = 1 << 29;
- int sum[505], d[502][82], p[502][82], len;
- vector<string> w;
- vector<int> tans;
- void sp(int n)
- {
- for(int i = 0; i < n; ++i)
- cout << ' ';
- }
- int main()
- {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- string str;
- int pos, tmp, lp = -1, ans, t2;
- bool isline;
- cin >> len;
- getline(cin, str);
- while(getline(cin, str))
- {
- int st = 0;
- string tmp = "";
- for(int i = 0; i < str.size(); ++i)
- if(st == 0)
- {
- if(str[i] == ' ')
- continue;
- else
- tmp += str[i], st = 1;
- }
- else
- {
- if(str[i] == ' ')
- {
- st = 0;
- w.push_back(tmp);
- tmp = "";
- }
- else
- tmp += str[i];
- }
- if(st == 1 && tmp.size() > 0)
- w.push_back(tmp);
- }
- for(int i = 0; i < 502; ++i)
- for(int j = 0; j < 82; ++j)
- d[i][j] = INF;
- d[0][len-1] = 0;
- w.push_back(string(len, 'a'));
- for(int i = 1; i <= w.size(); ++i)
- {
- int wl = w[i-1].size();
- for(int j = wl - 1; j < len; ++j)
- for(int jj = 0; jj < len; ++jj)
- {
- if(d[i][j] > d[i-1][jj] + sq(len-jj-1) + sq(j-wl+1))
- {
- d[i][j] = d[i-1][jj] + sq(len-jj-1) + sq(j-wl+1);
- p[i][j] = jj + 100;
- }
- if(jj < j - wl && d[i][j] > d[i-1][jj] + sq(j - wl - jj))
- {
- d[i][j] = d[i-1][jj] + sq(j - wl - jj);
- p[i][j] = jj;
- }
- }
- }
- ans = d[w.size()][len - 1];
- t2 = p[w.size()][len - 1] - 100;
- isline = false;
- for(int i = w.size() - 1; i > 0; --i)
- {
- tans.push_back(isline ? t2 + 100 : t2);
- isline = false;
- t2 = p[i][t2];
- if(t2 >= 100)
- isline = true, t2 -= 100;
- }
- reverse(tans.begin(), tans.end());
- cout << ans << endl;
- tans.back() += 100;
- for(int i = 0; i < (int)w.size() - 1; ++i)
- {
- pos = tans[i];
- if(pos >= 100) pos -= 100;
- pos -= (int)w[i].size() - 1;
- sp(pos - lp - 1);
- cout << w[i];
- lp = tans[i];
- if(tans[i] >= 100)
- {
- tans[i] -= 100;
- sp(len - tans[i] - 1);
- lp = -1;
- if(i < (int)w.size() - 2) cout << endl;
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment