Advertisement
CooBin

pagoda

Oct 31st, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. // I'm the bone of my code. Syntax is my body, data is my blood ...
  2. #include<bits/stdc++.h>
  3. #define FILE "pagoda"
  4. using namespace std;
  5.  
  6. int check(int lim)
  7. {
  8.     // check tu lim -> A.size() -1  co du de < lim ko
  9.  
  10.     for (int i = 0; i < 10; i++) rnum[i] = num[i];
  11.     bool flag = 0;
  12.     for (int i = A.size() - 1; i >= lim && !flag; i--)
  13.     {
  14.         for (int j = 0; j < R[i] - '0'; j++)
  15.             if (rnum[j]) flag = 1;
  16.         if (!rnum[ R[i] - '0' ]) { flag = 0; break; }
  17.         rnum[ R[i] - '0' ]--;
  18.     }
  19.    
  20. }
  21.  
  22. int dfs2(int u)
  23. {
  24.     if (u == A.size()) return 2;
  25.     if (!check(u)) return 0;
  26.  
  27.     for (int c = 0; c <= 9; c++)
  28.     if (num[c])
  29.     {
  30.         ans[u] = c + '0';      
  31.         num[c] --;
  32.         int tmp = dfs2(u + 1);
  33.         if (tmp) return tmp;
  34.         num[c] ++;
  35.     }
  36.     return 0;
  37. }
  38.  
  39. int dfs(int u)
  40. {
  41.     if (u == A.size()) return 1;
  42.     if (!check(u)) return 0;
  43.     for (int c = L[u] - '0'; c <= 9; c++)
  44.     if (num[c])
  45.     {
  46.         ans[u] = c + '0';
  47.         num[c]--;
  48.         if ( c != L[u] - '0' )
  49.         {
  50.             int tmp = dfs2(u + 1);
  51.             if (tmp) return tmp;
  52.         }
  53.         else
  54.         {  
  55.             int tmp = dfs(u + 1);
  56.             if (tmp == 2) return tmp;
  57.         }
  58.         num[c]++;
  59.     }
  60.     return 0;
  61. }
  62.  
  63. int main()
  64. {
  65.     if (fopen("main.in", "r"))
  66.         assert(freopen("main.in", "r", stdin));
  67.     else
  68.     if (fopen(FILE".inp", "r"))
  69.         assert(freopen(FILE".inp", "r", stdin)),
  70.         assert(freopen(FILE".out", "w", stdout));
  71.  
  72.     string A, B, C;
  73.     cin >> A >> B >> C;
  74.     string rA = A, rB = B;
  75.     reverse(rA.begin(), rA.end());
  76.     reverse(rB.begin(), rB.end());
  77.  
  78.     L = max(A, B);
  79.     R = min(rA, rB);
  80.     ans.resize(A.size());
  81.  
  82.     for (char c : C)
  83.         num[c - '0'] ++;
  84.  
  85.     if (dfs(0) == 2)
  86.         cout << ans << '\n';
  87.     else
  88.         cout << -1 << '\n';
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement