Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // I'm the bone of my code. Syntax is my body, data is my blood ...
- #include<bits/stdc++.h>
- #define FILE "pagoda"
- using namespace std;
- int check(int lim)
- {
- // check tu lim -> A.size() -1 co du de < lim ko
- for (int i = 0; i < 10; i++) rnum[i] = num[i];
- bool flag = 0;
- for (int i = A.size() - 1; i >= lim && !flag; i--)
- {
- for (int j = 0; j < R[i] - '0'; j++)
- if (rnum[j]) flag = 1;
- if (!rnum[ R[i] - '0' ]) { flag = 0; break; }
- rnum[ R[i] - '0' ]--;
- }
- }
- int dfs2(int u)
- {
- if (u == A.size()) return 2;
- if (!check(u)) return 0;
- for (int c = 0; c <= 9; c++)
- if (num[c])
- {
- ans[u] = c + '0';
- num[c] --;
- int tmp = dfs2(u + 1);
- if (tmp) return tmp;
- num[c] ++;
- }
- return 0;
- }
- int dfs(int u)
- {
- if (u == A.size()) return 1;
- if (!check(u)) return 0;
- for (int c = L[u] - '0'; c <= 9; c++)
- if (num[c])
- {
- ans[u] = c + '0';
- num[c]--;
- if ( c != L[u] - '0' )
- {
- int tmp = dfs2(u + 1);
- if (tmp) return tmp;
- }
- else
- {
- int tmp = dfs(u + 1);
- if (tmp == 2) return tmp;
- }
- num[c]++;
- }
- return 0;
- }
- int main()
- {
- if (fopen("main.in", "r"))
- assert(freopen("main.in", "r", stdin));
- else
- if (fopen(FILE".inp", "r"))
- assert(freopen(FILE".inp", "r", stdin)),
- assert(freopen(FILE".out", "w", stdout));
- string A, B, C;
- cin >> A >> B >> C;
- string rA = A, rB = B;
- reverse(rA.begin(), rA.end());
- reverse(rB.begin(), rB.end());
- L = max(A, B);
- R = min(rA, rB);
- ans.resize(A.size());
- for (char c : C)
- num[c - '0'] ++;
- if (dfs(0) == 2)
- cout << ans << '\n';
- else
- cout << -1 << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement