Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define DEBUG if (0 )
- #define COUT cout << "\e[36m"
- #define VAR(v) " [\e[32m" << #v << "\e[36m=\e[91m" << v << "\e[36m] "
- #define ENDL "\e[39m" << endl
- using namespace std;
- int k, n, ki;
- vector<int> avec, bvec, used, orgavec, aeqb;
- void clean()
- {
- ki = 0;
- used.clear(); used.resize(n, 0);
- aeqb.clear(); aeqb.resize(n, 0);
- }
- vector<int> strtovec(const string& s)
- {
- vector<int> ret(s.size());
- for (int i = 0; i < (int)s.size(); ++i)
- {
- ret[i] = s[i] - '0';
- }
- return ret;
- }
- template<typename T>
- ostream& operator<<(ostream& out, const vector<T> v)
- {
- out << " |";
- for (int i = 0; i < (int)v.size(); ++i)
- {
- out << v[i] << ((i == (int)v.size()-1)? "| " : ",");
- }
- return out;
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- int z;
- cin >> z;
- while(z--)
- {
- DEBUG COUT << endl << "NXT TEST" << ENDL;
- string astr, bstr;
- cin >> astr >> bstr >> k;
- avec = strtovec(astr);
- bvec = strtovec(bstr);
- orgavec = avec;
- n = (int)avec.size();
- clean();
- DEBUG COUT << VAR(n) << VAR(k)<< endl << "A:" << avec << endl << "B:" << bvec << ENDL;
- for (int i = n-1; i >= 0; --i)
- {
- if(i == n-1)
- {
- aeqb[i] = ((avec[i] < bvec[i])? 0 : (avec[i] == bvec[i])? 1 : 2);
- }
- else
- {
- aeqb[i] = ((avec[i] < bvec[i])? 0 : (avec[i] == bvec[i])? aeqb[i+1] : 2);
- }
- }
- aeqb.push_back(1);
- DEBUG COUT << "AEQB: " << aeqb << ENDL;
- int lastnot0 = -1;
- int lasttolower = -1, lowerto = -1, wasitequal = -1; ///last able to lower
- int lasti = -1;
- bool impossible = 0;
- DEBUG COUT VAR(ki) << "PHASE I getting even" << ENDL;
- for (int i = 0; i < n && ki < k; ++i)
- {
- DEBUG COUT << VAR(i) << VAR(avec[i]) << VAR(bvec[i]);
- if(avec[i] != bvec[i])
- {
- if(bvec[i] > 0 && avec[i] != bvec[i] -1) ///LASTTOLOWER I
- {
- lasttolower = i;
- lowerto = avec[i]-1;
- wasitequal = 1;
- }
- if(ki < k-1)
- {
- DEBUG COUT << "just even it" <<ENDL;
- ki++;
- used[i] = 1;
- avec[i] = bvec[i];
- lasti = i;
- if(ki == k-1)
- {
- DEBUG COUT << "ki = k-1" <<ENDL;
- break;
- }
- }
- }
- else
- {
- DEBUG COUT << "EQ" << ENDL;
- if(bvec[i] > 0) ///LASTTOLOWER II
- {
- lasttolower = i;
- lowerto = bvec[i]-1;
- wasitequal = 1;
- }
- }
- DEBUG COUT << VAR(i) << "A:" << avec << ENDL;
- }
- int exepti = n;
- DEBUG COUT << "A:" << avec << ENDL;
- if(ki == k-1)
- {
- DEBUG COUT VAR(ki) << "PHASE II the last K" << VAR(lasti) << ENDL;
- for(int i = lasti+1; i < n && ki < k; i++)
- {
- DEBUG COUT << VAR(i) << ENDL;
- if(avec[i] != bvec[i])
- {
- DEBUG COUT << "not eq" << VAR(aeqb[i+1])<< ENDL;
- if(bvec[i] > 0 && avec[i] != bvec[i] -1) ///LASTTOLOWER I
- {
- lasttolower = i;
- lowerto = avec[i]-1;
- wasitequal = 1;
- }
- if(aeqb[i+1] == 2)
- {
- DEBUG COUT << "EXEPT OR LOWER IT, a>b"<< VAR(i) << ENDL;
- if(bvec[i] != 0)
- {
- DEBUG COUT<< "last k found, lowering?" << ENDL;
- if(orgavec[i] == bvec[i] -1)
- {
- DEBUG COUT << "changed my mind, going to phase III cause a == a-1" << ENDL;
- exepti = i;
- break;
- /*ki+= ((orgavec[i] == bvec[i] -1)? 0 : 1);
- avec[i] =bvec[i]-1;
- used[i] = ((orgavec[i] == bvec[i] -1)? 0 : 1);*/
- }
- else
- {
- ki++;
- avec[i] =bvec[i]-1;
- used[i] = 1;
- }
- }
- else
- {
- ///use lasttolower?
- DEBUG COUT << "NOT ABLE TO END WITH ONE K" << VAR(i) << ENDL;
- exepti = i;
- break;
- }
- }
- else
- {
- DEBUG COUT << "Escape OR LOWER IT, a<=b"<< VAR(i) << VAR(aeqb[i+1]) << ENDL;
- if(aeqb[i+1] == 0)
- {
- DEBUG COUT << "last k found, getting even" << ENDL;
- ki++;
- avec[i] = bvec[i];
- used[i] = 1;
- }
- else if(bvec[i] != 0 && avec[i] != bvec[i]-1)
- {
- DEBUG COUT<< "last k found, lowering" << ENDL;
- ki++;
- avec[i] = bvec[i]-1;
- used[i] = i;
- }
- else if(0 && avec[i] > bvec[i]) ///LETS HOPE IF ITS IMPOSSIBLE NINERI WILL NOT BE FOUND
- {
- /*DEBUG COUT << "IMPOSSIBLE" << ENDL;
- cout << "-1\n";
- impossible = 1;
- break;*/
- }
- else
- {
- DEBUG COUT << "NOT ABLE TO END WITH ONE K" << VAR(i) << ENDL;
- exepti = i;
- break;
- }
- }
- }
- else
- {
- if(bvec[i] > 0) ///LASTTOLOWER II
- {
- lasttolower = i;
- lowerto = bvec[i]-1;
- wasitequal = 1;
- }
- }
- }
- }
- if(impossible)
- continue;
- DEBUG COUT << "A:" << avec << ENDL;
- DEBUG COUT << VAR(exepti) << ENDL;
- int minniner = 0, maxniner = 0, accniner = 0, nineri= -1;
- if(ki == k)
- {
- DEBUG COUT << "ANSWER FOUND after phase II" << ENDL;
- for(auto el : avec)
- cout << el;
- cout << "\n";
- continue;
- }
- int additki = 0;
- for(int i = n-1; i >= 0; i--)
- {
- if(i == n-1) DEBUG COUT VAR(ki) << "PHASE III looking for the niner" << ENDL;
- if(bvec[i] != 0)
- {
- accniner = maxniner + ((used[i] == 0)? ((orgavec[i] != bvec[i]-1)? 1 : 0) : ((orgavec[i] != bvec[i]-1)? 0 : -1));
- if(i <= exepti && ki+accniner >= k)
- {
- nineri = i;
- avec[i] = bvec[i] -1;
- ki += ((used[i] == 0)? ((orgavec[i] != bvec[i]-1)? 1 : 0) : ((orgavec[i] != bvec[i]-1)? 0 : -1));
- DEBUG COUT << "found nineri" << VAR(nineri) << VAR(avec[nineri]) << ENDL;
- used[i] = ((orgavec[i] != bvec[i]-1)? 1 : 0);
- break;
- }
- if(orgavec[i] ==bvec[i]-1 && bvec[i] > 1)
- {
- accniner = maxniner + ((used[i] == 0)? 1 : 0);
- if(i <= exepti && ki+accniner >= k)
- {
- nineri = i;
- avec[i] = bvec[i] -2;
- ki += ((used[i] == 0)? 1 : 0);
- DEBUG COUT << "found nineri, that is lower" << VAR(nineri) << VAR(avec[nineri]) << ENDL;
- used[i] = ((orgavec[i] != bvec[i]-1)? 1 : 0);
- break;
- }
- }
- }
- if(used[i] == 0)
- {
- maxniner++;
- }
- else
- {
- additki++;
- used[i] = 0;
- avec[i] = orgavec[i];
- }
- }
- ki -= additki;
- if(nineri == -1)
- {
- DEBUG COUT << "COULDNT FIND NINERI, -1" << ENDL;
- cout << "-1\n";
- continue;
- }
- DEBUG COUT << "A:" << avec << ENDL;
- DEBUG COUT << VAR(nineri) << VAR(maxniner) << ENDL;
- for(int i = nineri+1; i < n; i++)
- {
- if(i == nineri+1) DEBUG COUT VAR(ki) << "PHASE IV nineing" << ENDL;
- DEBUG COUT << VAR(i) << ENDL;
- if(ki < k || used[i] == 1)
- {
- avec[i] = 9;
- ki += ((used[i] == 0)? ((orgavec[i] != 9)? 1 : 0) : ((orgavec[i] != 9)? 0 : -1));
- used[i] = ((orgavec[i] != 9)? 1 : 0);
- }
- }
- DEBUG COUT << "A:" << avec << ENDL;
- for(int i = n-1; i > nineri && ki < k; i--)
- {
- if(i == n-1) DEBUG COUT VAR(ki) << "PHASE V 8ing" << ENDL;
- if(used[i] == 0)
- {
- avec[i] = 8;
- ki++;
- }
- }
- DEBUG COUT << "A:" << avec << ENDL;
- if(ki == k)
- {
- for(auto el : avec)
- cout << el;
- cout << "\n";
- }
- else
- {
- cout << "-1\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement