Advertisement
999ms

Untitled

Jul 17th, 2021
1,086
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.53 KB | None | 0 0
  1. #pragma GCC Optimize("Ofast")
  2. #include <bits/stdc++.h>
  3. #define all(x) begin(x), end(x)
  4.  
  5. using namespace std;
  6. using ll = long long;
  7.  
  8. const bool TEST = true;
  9.  
  10.  
  11. string BAD;
  12.  
  13. string solveEq(char first, map<char, int> mp, int n) {
  14.   mp[first] -= 2;
  15.   vector<pair<char, int>> tmp(all(mp));
  16.   string ans = "";
  17.   ans.reserve(n);
  18.   ans.push_back(first);
  19.   ans.push_back(first);
  20.   string buffer;
  21.  
  22.   for (auto& [k, v] : tmp) {
  23.     if (k == first) continue;
  24.     while (v--) {
  25.       buffer.push_back(k);
  26.     }
  27.   }
  28.  
  29.   int x = mp[first];
  30.  
  31.   if (x > buffer.size()) {
  32.     return BAD;
  33.   }
  34.  
  35.   int pos = 0;
  36.   for (int i = 0; i < buffer.size(); i++) {
  37.     if (buffer[i] < first) {
  38.       int rem = buffer.size() - i;
  39.       if (rem > x) {
  40.         ans.push_back(buffer[i]);
  41.       } else {
  42.         while (i < buffer.size()) {
  43.           ans.push_back(buffer[i++]);
  44.           ans.push_back(first);
  45.         }
  46.         assert(ans.size() == n);
  47.         return ans;
  48.       }
  49.     } else {
  50.       if (i == 0) {
  51.         while (i < buffer.size()) {
  52.           ans.push_back(buffer[i++]);
  53.           if (x > 0) {
  54.             ans.push_back(first);
  55.             x--;
  56.           }
  57.         }
  58.         assert(x == 0);
  59.         return ans;
  60.       } else {
  61.         while (i < buffer.size()) {
  62.           if (x > 0) {
  63.             ans.push_back(first);
  64.             x--;
  65.           }
  66.           ans.push_back(buffer[i++]);
  67.         }
  68.         assert(x == 0);
  69.         return ans;
  70.       }
  71.     }
  72.   }
  73.  
  74.   return ans;
  75. }
  76.  
  77. string build(char first, char second, map<char, int> mp, int n) {
  78.   if (first != second) {
  79.     mp[first]--;
  80.     mp[second]--;
  81.     if (mp[first] == 0) mp.erase(mp.find(first));
  82.     if (mp[second] == 0) mp.erase(mp.find(second));
  83.    
  84.    
  85.     vector<pair<char, int>> tmp(all(mp));
  86.     bool kek = false;
  87.     for (int i = 0; i + 1 < tmp.size(); i++) {
  88.       if (tmp[i].first == first && tmp[i + 1].first == second) {
  89.         if (i + 2 < tmp.size()) {
  90.           kek = true;
  91.           break;
  92.         } else {
  93.           swap(tmp[i], tmp[i + 1]);
  94.           break;
  95.         }
  96.       }
  97.     }
  98.    
  99.     string ans = "";
  100.     ans.reserve(n);
  101.     ans.push_back(first);
  102.     ans.push_back(second);
  103.    
  104.     for (int i = 0; i < tmp.size(); i++) {
  105.       auto [k, v] = tmp[i];
  106.       if (k == second && kek) {
  107.         ans.push_back(tmp[i + 1].first);
  108.         tmp[i + 1].second--;
  109.       }
  110.       for (int itr = 0; itr < v; itr++) {
  111.         ans.push_back(k);
  112.       }
  113.     }
  114.     return ans;
  115.   } else {
  116.     return solveEq(first, mp, n);
  117.   }
  118. }
  119.  
  120. string solve(string s) {
  121.   const int n = s.size();
  122.   sort(all(s));
  123.  
  124.   map<char, int> cnt;
  125.   for (char ch : s) cnt[ch]++;
  126.  
  127.   bool hasUn = false;
  128.   for (auto& [k, v] : cnt) {
  129.     if (v == 1) {
  130.       auto mp = cnt;
  131.       mp[k]--;
  132.      
  133.       string ans = "";
  134.       ans.push_back(k);
  135.       for (auto& [key, val] : mp) {
  136.         while (val--) {
  137.           ans.push_back(key);
  138.         }
  139.       }
  140.       return ans;
  141.      
  142.     }
  143.   }
  144.  
  145.   string answer = s;
  146.   reverse(all(answer));
  147.   BAD = answer;
  148.  
  149.   for (auto [k1, v1] : cnt) {
  150.     for (auto [k2, _] : cnt) {
  151.       if (k1 != k2 || v1 > 1) {
  152.         auto res = build(k1, k2, cnt, n);
  153.         assert(res.size() == n);
  154.         if (res < answer) {
  155.           answer = res;
  156.         }
  157.       }
  158.     }
  159.   }
  160.   return answer;
  161. }
  162.  
  163.  
  164. int Calc(string& s) {
  165.   int n = s.size();
  166.   for (int i = 1; i + 1 < n; i++) {
  167.     if (s[i] == s[0] && s[i + 1] == s[1]) return 2;
  168.   }
  169.   for (int i = 1; i < n; i++) {
  170.     if (s[i] == s[0]) return 1;
  171.   }
  172.   return 0;
  173. }
  174.  
  175. string brute(string s) {
  176.   sort(all(s));
  177.   string best = s;
  178.   reverse(all(best));
  179.   int cnt = s.size();
  180.   do {
  181.     int cur = Calc(s);
  182.     if (cur < cnt) {
  183.       cnt = cur;
  184.       best = s;
  185.     } else if (cur == cnt) {
  186.       best = min(best, s);
  187.     }
  188.   } while (next_permutation(all(s)));
  189.   return best;
  190. }
  191.  
  192. string gen(int n) {
  193.   string ans(n, 'a');
  194.   for (int i = 0; i < n; i++) {
  195.     ans[i] += rand() % 5;
  196.   }
  197.   return ans;
  198. }
  199.  
  200. void Test() {
  201.   while (true) {
  202.     int n = 6;
  203.     string f = gen(n);
  204.    
  205.     string a = solve(f);
  206.     string b = brute(f);
  207.      
  208.    
  209.     if (a != b) {
  210.       cout << f << ' ' << a << ' ' << b << endl;
  211.     }
  212.      
  213.     assert(a == b);
  214.    
  215.   }
  216. }
  217.  
  218. int main() {
  219.   ios_base::sync_with_stdio(false);
  220.   cin.tie(nullptr);
  221.   cout.tie(nullptr);
  222.   int t;
  223.   if (TEST) {
  224.     cin >> t;
  225.   } else {
  226.     t = 1;
  227.   }
  228.  
  229.   //Test();
  230.  
  231.   while (t--) {
  232.     string s;
  233.     cin >> s;
  234.     cout << solve(s) << '\n';
  235.   }
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement