Advertisement
Abrar_Al_Samit

NthPermutation (LOJ 1060)

Aug 3rd, 2021
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. vector<int>freq[26];
  6. long long N, dp[1<<20];
  7. string ans;
  8.  
  9. long long solve(int mask, int k) {
  10.     long long &ret = dp[mask];
  11.     if(mask==(1<<N)-1) return ret = 1;
  12.     if(ret!=0) return ret;
  13.     for(int i=0; i<26; ++i) if(!freq[i].empty()) {
  14.         int idx = freq[i].back();
  15.         freq[i].pop_back();
  16.         ret += solve(mask | (1<<idx), k-ret);
  17.         freq[i].push_back(idx);
  18.     }
  19.     return ret;
  20. }
  21. void construct(int mask, int k) {
  22.     if(mask==(1<<N)-1) return;
  23.     for(int i=0; i<26; ++i) if(!freq[i].empty()) {
  24.         int idx = freq[i].back();
  25.         freq[i].pop_back();
  26.         long long got = dp[mask | (1<<idx)];
  27.         if(got >= k) {
  28.             ans += 'a' + i;
  29.             construct(mask | (1<<idx), k);
  30.             return;
  31.         }
  32.         k -= got;
  33.         freq[i].push_back(idx);
  34.     }
  35. }
  36. void PlayGround() {
  37.     string s; cin >> s;    
  38.     int k; cin >> k;
  39.     N = s.size();
  40.     for(int i=0; i<(1<<N); ++i) dp[i] = 0;
  41.     for(int i=0; i<N; ++i) {
  42.         freq[s[i]-'a'].push_back(i);
  43.     }
  44.     if(solve(0, k) < k) {
  45.         cout << "Impossible\n";
  46.     } else {
  47.         construct(0, k);
  48.         cout << ans << '\n';
  49.     }
  50.     ans.clear();
  51.     for(auto &it : freq) it.clear();
  52.  
  53.     // cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  54. }
  55. int main() {
  56.  
  57.     int T; cin >> T;
  58.     for(int i=1; i<=T; ++i) {
  59.         cout << "Case " << i << ": ";
  60.         PlayGround();
  61.     }
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement