Advertisement
pb_jiang

LC943 TLE

Nov 19th, 2022
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. class Solution
  2. {
  3.     vector<vector<int>> suff_len;
  4.     int check_suffix(const string &str, const string &suffix)
  5.     {
  6.         int strlen = str.size();
  7.         int sfxlen = suffix.size();
  8.         int mlen = min(strlen, sfxlen);
  9.         for (int i = mlen; i >= 0; --i) {
  10.             if (str.substr(strlen - i) == suffix.substr(0, i))
  11.                 return i;
  12.         }
  13.         return 0;
  14.     }
  15.     int n;
  16.     vector<vector<string>> dp;
  17.     int lowbit(int x) { return x ^ -x; }
  18.  
  19.     string search(int node, int state, const vector<string> &ws)
  20.     {
  21.         if (dp[node][state] != "")
  22.             return dp[node][state];
  23.         int prev_state = state ^ (1 << node);
  24.         string ans = "";
  25.         for (int i = 0; i < n; ++i) {
  26.             if (((1 << i) | prev_state) == prev_state) {
  27.                 string opt = search(i, prev_state, ws);
  28.                 // int suffix = check_suffix(opt, ws[node]);
  29.                 int suffix = suff_len[i][node];
  30.                 string ans2 = opt + ws[node].substr(suffix);
  31.                 if (ans == "")
  32.                     ans = ans2;
  33.                 ans = ans.size() < ans2.size() ? ans : ans2;
  34.             }
  35.         }
  36.  
  37.         return dp[node][state] = ans;
  38.     }
  39.  
  40.   public:
  41.     string shortestSuperstring(vector<string> &words)
  42.     {
  43.         n = words.size();
  44.         dp = vector<vector<string>>(n, vector<string>(1 << n));
  45.         for (int i = 0; i < n; ++i) {
  46.             dp[i][1 << i] = words[i];
  47.         }
  48.         int state = (1 << n);
  49.         suff_len = vector<vector<int>>(n, vector<int>(n));
  50.         for (int i = 0; i < n; ++i) {
  51.             for (int j = 0; j < n; ++j) {
  52.                 if (i == j)
  53.                     continue;
  54.                 suff_len[i][j] = check_suffix(words[i], words[j]);
  55.             }
  56.         }
  57.  
  58.         string ans = search(0, state - 1, words);
  59.         for (int i = 1; i < n; ++i) {
  60.             string opt = search(i, state - 1, words);
  61.             ans = ans.size() < opt.size() ? ans : opt;
  62.         }
  63.         return ans;
  64.     }
  65. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement