Guest User

Untitled

a guest
Jul 21st, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<vector>
  5. #include<algorithm>
  6. #include<string>
  7. using namespace std;
  8.  
  9. #define sq(x) (x)*(x)*(x)
  10. const int INF = 1 << 29;
  11.  
  12. int sum[505], d[502][82], p[502][82], len;
  13. vector<string> w;
  14. vector<int> tans;
  15.  
  16. void sp(int n)
  17. {
  18.     for(int i = 0; i < n; ++i)
  19.         cout << ' ';
  20. }
  21.  
  22. int main()
  23. {
  24.     freopen("input.txt", "r", stdin);
  25.     freopen("output.txt", "w", stdout);
  26.  
  27.     string str;
  28.     int pos, tmp, lp = -1, ans, t2;
  29.     bool isline;
  30.  
  31.     cin >> len;
  32.  
  33.     getline(cin, str);
  34.     while(getline(cin, str))
  35.     {
  36.         int st = 0;
  37.         string tmp = "";
  38.         for(int i = 0; i < str.size(); ++i)
  39.             if(st == 0)
  40.             {
  41.                 if(str[i] == ' ')
  42.                     continue;
  43.                 else
  44.                     tmp += str[i], st = 1;
  45.             }
  46.             else
  47.             {
  48.                 if(str[i] == ' ')
  49.                 {
  50.                     st = 0;
  51.                     w.push_back(tmp);
  52.                     tmp = "";
  53.                 }
  54.                 else
  55.                     tmp += str[i];
  56.             }
  57.         if(st == 1 && tmp.size() > 0)
  58.             w.push_back(tmp);
  59.     }
  60.  
  61.     for(int i = 0; i < 502; ++i)
  62.         for(int j = 0; j < 82; ++j)
  63.             d[i][j] = INF;
  64.     d[0][len-1] = 0;
  65.     w.push_back(string(len, 'a'));
  66.     for(int i = 1; i <= w.size(); ++i)
  67.     {
  68.         int wl = w[i-1].size();
  69.         for(int j = wl - 1; j < len; ++j)
  70.             for(int jj = 0; jj < len; ++jj)
  71.             {
  72.                 if(d[i][j] > d[i-1][jj] + sq(len-jj-1) + sq(j-wl+1))
  73.                 {
  74.                     d[i][j] = d[i-1][jj] + sq(len-jj-1) + sq(j-wl+1);
  75.                     p[i][j] = jj + 100;
  76.                 }
  77.                 if(jj < j - wl && d[i][j] > d[i-1][jj] + sq(j - wl - jj))
  78.                 {
  79.                     d[i][j] = d[i-1][jj] + sq(j - wl - jj);
  80.                     p[i][j] = jj;
  81.                 }
  82.             }
  83.     }
  84.  
  85.     ans = d[w.size()][len - 1];
  86.     t2 = p[w.size()][len - 1] - 100;
  87.     isline = false;
  88.     for(int i = w.size() - 1; i > 0; --i)
  89.     {
  90.         tans.push_back(isline ? t2 + 100 : t2);
  91.  
  92.         isline = false;
  93.         t2 = p[i][t2];
  94.         if(t2 >= 100)
  95.             isline = true, t2 -= 100;
  96.     }
  97.     reverse(tans.begin(), tans.end());
  98.     cout << ans << endl;
  99.  
  100.     tans.back() += 100;
  101.     for(int i = 0; i < (int)w.size() - 1; ++i)
  102.     {
  103.         pos = tans[i];
  104.         if(pos >= 100) pos -= 100;
  105.         pos -= (int)w[i].size() - 1;
  106.         sp(pos - lp - 1);
  107.         cout << w[i];
  108.         lp = tans[i];
  109.         if(tans[i] >= 100)
  110.         {
  111.             tans[i] -= 100;
  112.             sp(len - tans[i] - 1);
  113.             lp = -1;
  114.             if(i < (int)w.size() - 2) cout << endl;
  115.         }
  116.     }
  117.     return 0;
  118. }
Add Comment
Please, Sign In to add comment