Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define DEBUG if (0 )
  4. #define COUT cout << "\e[36m"
  5. #define VAR(v) " [\e[32m" << #v << "\e[36m=\e[91m" << v << "\e[36m] "
  6. #define ENDL "\e[39m" << endl
  7.  
  8. using namespace std;
  9.  
  10. int k, n, ki;
  11. vector<int> avec, bvec, used, orgavec, aeqb;
  12.  
  13. void clean()
  14. {
  15.     ki = 0;
  16.     used.clear(); used.resize(n, 0);
  17.     aeqb.clear(); aeqb.resize(n, 0);
  18. }
  19.  
  20. vector<int> strtovec(const string& s)
  21. {
  22.     vector<int> ret(s.size());
  23.     for (int i = 0; i < (int)s.size(); ++i)
  24.     {
  25.         ret[i] = s[i] - '0';
  26.     }
  27.     return ret;
  28. }
  29. template<typename T>
  30. ostream& operator<<(ostream& out, const vector<T> v)
  31. {
  32.     out << " |";
  33.     for (int i = 0; i < (int)v.size(); ++i)
  34.     {
  35.         out << v[i] << ((i == (int)v.size()-1)? "| " : ",");
  36.     }
  37.     return out;
  38. }
  39.  
  40. int main()
  41. {
  42.     ios_base::sync_with_stdio(0);
  43.     cin.tie(0);
  44.     int z;
  45.     cin >> z;
  46.     while(z--)
  47.     {
  48.         DEBUG COUT << endl << "NXT TEST" << ENDL;
  49.  
  50.         string astr, bstr;
  51.         cin >> astr >> bstr >> k;
  52.         avec = strtovec(astr);
  53.         bvec = strtovec(bstr);
  54.         orgavec = avec;
  55.  
  56.         n = (int)avec.size();
  57.  
  58.         clean();
  59.         DEBUG COUT << VAR(n) << VAR(k)<< endl << "A:" << avec << endl << "B:" << bvec << ENDL;
  60.  
  61.         for (int i = n-1; i >= 0; --i)
  62.         {
  63.             if(i == n-1)
  64.             {
  65.                 aeqb[i] = ((avec[i] < bvec[i])? 0 : (avec[i] == bvec[i])? 1 : 2);
  66.             }
  67.             else
  68.             {
  69.                 aeqb[i] = ((avec[i] < bvec[i])? 0 : (avec[i] == bvec[i])? aeqb[i+1] : 2);
  70.             }
  71.         }
  72.         aeqb.push_back(1);
  73.         DEBUG COUT << "AEQB: " << aeqb << ENDL;
  74.  
  75.         int lastnot0 = -1;
  76.         int lasttolower = -1, lowerto = -1, wasitequal = -1; ///last able to lower
  77.         int lasti = -1;
  78.         bool impossible = 0;
  79.         DEBUG COUT VAR(ki) << "PHASE I getting even" << ENDL;
  80.         for (int i = 0; i < n && ki < k; ++i)
  81.         {
  82.             DEBUG COUT << VAR(i) << VAR(avec[i]) << VAR(bvec[i]);
  83.  
  84.             if(avec[i] != bvec[i])
  85.             {
  86.                 if(bvec[i] > 0 && avec[i] != bvec[i] -1) ///LASTTOLOWER I
  87.                 {
  88.                     lasttolower = i;
  89.                     lowerto = avec[i]-1;
  90.                     wasitequal = 1;
  91.                 }
  92.                 if(ki < k-1)
  93.                 {
  94.                     DEBUG COUT << "just even it" <<ENDL;
  95.                     ki++;
  96.                     used[i] = 1;
  97.                     avec[i] = bvec[i];
  98.                     lasti = i;
  99.                     if(ki == k-1)
  100.                     {
  101.                         DEBUG COUT << "ki = k-1" <<ENDL;
  102.                         break;
  103.                     }
  104.                 }
  105.             }
  106.             else
  107.             {
  108.                 DEBUG COUT << "EQ" << ENDL;
  109.                 if(bvec[i] > 0)  ///LASTTOLOWER II
  110.                 {
  111.                     lasttolower = i;
  112.                     lowerto = bvec[i]-1;
  113.                     wasitequal = 1;
  114.                 }
  115.             }
  116.             DEBUG COUT << VAR(i) << "A:" << avec << ENDL;
  117.         }
  118.  
  119.         int exepti = n;
  120.          DEBUG COUT << "A:" << avec << ENDL;
  121.         if(ki == k-1)
  122.         {
  123.             DEBUG COUT VAR(ki) << "PHASE II the last K" << VAR(lasti) << ENDL;
  124.             for(int i = lasti+1; i < n && ki < k; i++)
  125.             {
  126.                 DEBUG COUT << VAR(i) << ENDL;
  127.                 if(avec[i] != bvec[i])
  128.                 {
  129.                     DEBUG COUT << "not eq" << VAR(aeqb[i+1])<<  ENDL;
  130.                     if(bvec[i] > 0 && avec[i] != bvec[i] -1) ///LASTTOLOWER I
  131.                     {
  132.                         lasttolower = i;
  133.                         lowerto = avec[i]-1;
  134.                         wasitequal = 1;
  135.                     }
  136.                     if(aeqb[i+1] == 2)
  137.                     {
  138.                         DEBUG COUT << "EXEPT OR LOWER IT, a>b"<< VAR(i) << ENDL;
  139.                         if(bvec[i] != 0)
  140.                         {
  141.                             DEBUG COUT<< "last k found, lowering?" << ENDL;
  142.                             if(orgavec[i] == bvec[i] -1)
  143.                             {
  144.                                 DEBUG COUT << "changed my mind, going to phase III cause a == a-1" << ENDL;
  145.                                 exepti = i;
  146.                                 break;
  147.                                 /*ki+= ((orgavec[i] == bvec[i] -1)? 0 : 1);
  148.                                 avec[i] =bvec[i]-1;
  149.                                 used[i] = ((orgavec[i] == bvec[i] -1)? 0 : 1);*/
  150.                             }
  151.                             else
  152.                             {
  153.                                 ki++;
  154.                                 avec[i] =bvec[i]-1;
  155.                                 used[i] = 1;
  156.                             }
  157.  
  158.  
  159.                         }
  160.                         else
  161.                         {
  162.                             ///use lasttolower?
  163.                             DEBUG COUT << "NOT ABLE TO END WITH ONE K" << VAR(i) << ENDL;
  164.                             exepti = i;
  165.                             break;
  166.                         }
  167.                     }
  168.                     else
  169.                     {
  170.                         DEBUG COUT << "Escape OR LOWER IT, a<=b"<< VAR(i) << VAR(aeqb[i+1]) << ENDL;
  171.                         if(aeqb[i+1] == 0)
  172.                         {
  173.                             DEBUG COUT << "last k found, getting even" << ENDL;
  174.                             ki++;
  175.                             avec[i] = bvec[i];
  176.                             used[i] = 1;
  177.                         }
  178.                         else if(bvec[i] != 0 && avec[i] != bvec[i]-1)
  179.                         {
  180.                              DEBUG COUT<< "last k found, lowering" << ENDL;
  181.                             ki++;
  182.                             avec[i] = bvec[i]-1;
  183.                             used[i] = i;
  184.                         }
  185.                         else if(0 && avec[i] > bvec[i]) ///LETS HOPE IF ITS IMPOSSIBLE NINERI WILL NOT BE FOUND
  186.                         {
  187.                             /*DEBUG COUT << "IMPOSSIBLE" << ENDL;
  188.                             cout << "-1\n";
  189.                             impossible = 1;
  190.                             break;*/
  191.                         }
  192.                         else
  193.                         {
  194.                             DEBUG COUT << "NOT ABLE TO END WITH ONE K" << VAR(i) << ENDL;
  195.                             exepti = i;
  196.                             break;
  197.                         }
  198.                     }
  199.                 }
  200.                 else
  201.                 {
  202.                     if(bvec[i] > 0)  ///LASTTOLOWER II
  203.                     {
  204.                         lasttolower = i;
  205.                         lowerto = bvec[i]-1;
  206.                         wasitequal = 1;
  207.                     }
  208.                 }
  209.             }
  210.         }
  211.         if(impossible)
  212.             continue;
  213.         DEBUG COUT << "A:" << avec << ENDL;
  214.         DEBUG COUT << VAR(exepti) << ENDL;
  215.         int minniner = 0, maxniner = 0, accniner = 0, nineri= -1;
  216.  
  217.         if(ki == k)
  218.         {
  219.             DEBUG COUT << "ANSWER FOUND after phase II" << ENDL;
  220.             for(auto el : avec)
  221.                 cout << el;
  222.             cout << "\n";
  223.             continue;
  224.         }
  225.         int additki = 0;
  226.         for(int i = n-1; i >= 0; i--)
  227.         {
  228.             if(i == n-1) DEBUG COUT VAR(ki) << "PHASE III looking for the niner" << ENDL;
  229.  
  230.             if(bvec[i] != 0)
  231.             {
  232.                 accniner = maxniner + ((used[i] == 0)? ((orgavec[i] != bvec[i]-1)? 1 : 0) : ((orgavec[i] != bvec[i]-1)? 0 : -1));
  233.                 if(i <= exepti && ki+accniner >= k)
  234.                 {
  235.                     nineri = i;
  236.                     avec[i] = bvec[i] -1;
  237.                     ki += ((used[i] == 0)? ((orgavec[i] != bvec[i]-1)? 1 : 0) : ((orgavec[i] != bvec[i]-1)? 0 : -1));
  238.                     DEBUG COUT << "found nineri" << VAR(nineri) << VAR(avec[nineri]) << ENDL;
  239.                     used[i] = ((orgavec[i] != bvec[i]-1)? 1 : 0);
  240.                     break;
  241.                 }
  242.                 if(orgavec[i] ==bvec[i]-1 && bvec[i] > 1)
  243.                 {
  244.                     accniner = maxniner + ((used[i] == 0)? 1 : 0);
  245.                     if(i <= exepti && ki+accniner >= k)
  246.                     {
  247.                         nineri = i;
  248.                         avec[i] = bvec[i] -2;
  249.                         ki += ((used[i] == 0)? 1 : 0);
  250.                         DEBUG COUT << "found nineri, that is lower" << VAR(nineri) << VAR(avec[nineri]) << ENDL;
  251.                         used[i] = ((orgavec[i] != bvec[i]-1)? 1 : 0);
  252.                         break;
  253.                     }
  254.                 }
  255.  
  256.             }
  257.  
  258.             if(used[i] == 0)
  259.             {
  260.                 maxniner++;
  261.             }
  262.             else
  263.             {
  264.                 additki++;
  265.                 used[i] = 0;
  266.                 avec[i] = orgavec[i];
  267.             }
  268.         }
  269.         ki -= additki;
  270.         if(nineri == -1)
  271.         {
  272.             DEBUG COUT << "COULDNT FIND NINERI, -1" << ENDL;
  273.             cout << "-1\n";
  274.             continue;
  275.         }
  276.         DEBUG COUT << "A:" << avec << ENDL;
  277.         DEBUG COUT << VAR(nineri) << VAR(maxniner) << ENDL;
  278.         for(int i = nineri+1; i < n; i++)
  279.         {
  280.             if(i == nineri+1) DEBUG COUT VAR(ki) << "PHASE IV nineing" << ENDL;
  281.             DEBUG COUT << VAR(i) << ENDL;
  282.             if(ki < k || used[i] == 1)
  283.             {
  284.                 avec[i] = 9;
  285.                 ki += ((used[i] == 0)? ((orgavec[i] != 9)? 1 : 0) : ((orgavec[i] != 9)? 0 : -1));
  286.                 used[i] = ((orgavec[i] != 9)? 1 : 0);
  287.             }
  288.  
  289.         }
  290.         DEBUG COUT << "A:" << avec << ENDL;
  291.         for(int i = n-1; i > nineri && ki < k; i--)
  292.         {
  293.             if(i == n-1) DEBUG COUT VAR(ki) << "PHASE V 8ing" << ENDL;
  294.             if(used[i] == 0)
  295.             {
  296.                 avec[i] = 8;
  297.                 ki++;
  298.             }
  299.         }
  300.         DEBUG COUT << "A:" << avec << ENDL;
  301.  
  302.  
  303.  
  304.         if(ki == k)
  305.         {
  306.             for(auto el : avec)
  307.                 cout << el;
  308.             cout << "\n";
  309.         }
  310.         else
  311.         {
  312.             cout << "-1\n";
  313.         }
  314.  
  315.  
  316.     }
  317.     return 0;
  318. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement