Advertisement
deushiro

Untitled

Feb 24th, 2020
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <set>
  4. #include <stdlib.h>
  5. #include <algorithm>
  6. #include <iostream>
  7. #include <iterator>
  8. #include <vector>
  9. #include <set>
  10. #include <string>
  11. #include <fstream>
  12. #include <ctime>
  13.  
  14.  
  15. using namespace std;
  16.  
  17. ifstream in("input.txt");
  18. ofstream out("output.txt");
  19.  
  20. int n;
  21. vector<string> a;
  22. int maxi = 0;
  23. vector<int> res;
  24. vector<bool> used;
  25. vector<vector<int>> dp(n, vector<int>(n, -1));
  26. vector<int> ans;
  27. int mnsize = 1e9;
  28. clock_t t;
  29. int solve(string a, string b) {
  30.     int mx = 0;
  31.     string x = "";
  32.     for (int i = 0; i < b.size(); ++i) {
  33.         x.push_back(b[i]);
  34.         if (x.size() > a.size())
  35.             break;
  36.         if (a.substr(a.size() - x.size(), x.size()) == x)
  37.             mx = x.size();
  38.     }
  39.     return mx;
  40. }
  41.  
  42.  
  43. void sum(int u) {
  44.     int pos = 0;
  45.     int mx = -1;
  46.     bool flag = false;
  47.     for (int v = 0; v < n; ++v) {
  48.         if (!used[v] && dp[u][v] > mx) {
  49.             pos = v;
  50.             mx = dp[u][v];
  51.             flag = true;
  52.         }
  53.     }
  54.     if (!flag)
  55.         return;
  56.     used[pos] = true;
  57.     maxi += a[pos].size() - dp[u][pos];
  58.     res.push_back(pos);
  59.     sum(pos);
  60. }
  61.  
  62.  
  63. void rec(int u, int sz, int c) {
  64.     if (sz >= mnsize)
  65.         return;
  66.     if (c == n) {
  67.         cout << sz << endl;
  68.         string s = a[ans[0]];
  69.         for (int i = 1; i < n; ++i) {
  70.             string xs = a[ans[i]].substr(dp[ans[i - 1]][ans[i]]);
  71.             s += xs;
  72.         }
  73.         out << s << endl;
  74.         mnsize = s.size();
  75.         return;
  76.     }
  77.     for (int v = 0; v < n; ++v) {
  78.         if (!used[v]) {
  79.             res.push_back(v);
  80.             used[v] = true;
  81.             rec(v, sz + a[v].size() - dp[u][v], c + 1);
  82.             res.pop_back();
  83.             used[v] = false;
  84.         }
  85.     }
  86. }
  87.  
  88. int main() {
  89.     t = clock();
  90.     in >> n;
  91.     a.resize(n);
  92.     ans.resize(n);
  93.     for (int i = 0; i < n; ++i)
  94.         in >> a[i];
  95.     dp.resize(n, vector<int>(n));
  96.     for (int i = 0; i < n; ++i) {
  97.         for (int j = 0; j < n; ++j) {
  98.             if (i != j) {
  99.                 dp[i][j] = solve(a[i], a[j]);
  100.             }
  101.         }
  102.     }
  103.  
  104.     clock_t t2 = clock();
  105.     out << double(t2 - t) / CLOCKS_PER_SEC << endl;
  106.  
  107.     int st = 0;
  108.     for (int i = 0; i < n; ++i) {
  109.         res.clear();
  110.         res.push_back(i);
  111.         maxi = a[i].size();
  112.         used.assign(n, false);
  113.         used[i] = true;
  114.         sum(i);
  115.         if (maxi < mnsize) {
  116.             st = i;
  117.             mnsize = maxi;
  118.             ans = res;
  119.         }
  120.     }
  121.     string s = a[ans[0]];
  122.     for (int i = 1; i < n; ++i) {
  123.         string xs = a[ans[i]].substr(dp[ans[i - 1]][ans[i]]);
  124.         s += xs;
  125.     }
  126.     out << mnsize << " " << s.size() << endl;
  127.     out << s << endl;
  128.     for (int i = 0; i < n; ++i) {
  129.         res.clear();
  130.         res.push_back(i);
  131.         maxi = a[i].size();
  132.         used.assign(n, false);
  133.         used[i] = true;
  134.         rec(i, a[i].size(), 1);
  135.     }
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement