Korotkodul

регион

Jul 20th, 2022 (edited)
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. #define vec vector
  12. using namespace std;
  13. using ll = long long;
  14. using ld = long double;
  15. using db = double;
  16. void cv(vector <int> &v){
  17.     for (auto x: v) cout<<x<<' ';
  18.     cout<<"\n";
  19. }
  20.  
  21. void cvl(vector <ll> &v){
  22.     for (auto x: v) cout<<x<<' ';
  23.     cout<<"\n";
  24. }
  25.  
  26.  
  27. void cvv(vector <vector <int> > &v){
  28.     for (auto x: v) cv(x);
  29.     cout<<"\n";
  30. }
  31.  
  32. void cvb(vector <bool> v){
  33.     for (bool x: v) cout<<x<<' ';
  34.     cout<<"\n";
  35. }
  36.  
  37. void cvs(vector <string>  v){
  38.     for (auto a: v){
  39.         cout<<a<<"\n";
  40.     }
  41. }
  42.  
  43. bool dig(char x){
  44.     int k = x - '0';
  45.     return k >= 0 && k < 10;
  46. }
  47.  
  48. bool sh=0;
  49.  
  50. void see(vector <pair <int, char> > v){
  51.     for (auto p: v){
  52.         cout<<p.first<<' '<<p.second<<"\n";
  53.     }
  54. }
  55.  
  56.  
  57. int main()
  58. {
  59.     ios::sync_with_stdio(0);
  60.     cin.tie(0);
  61.     cout.tie(0);
  62.     string s;
  63.     cin>>s;
  64.     vector <pair <int, char> > v;
  65.     int n = s.size();
  66.     int id=0;
  67.     while (id < n){
  68.         string nmb="";
  69.         while (id < n && dig(s[id]) ){
  70.             nmb += s[id];
  71.             id++;
  72.         }
  73.         ll k;
  74.         if (nmb == ""){
  75.             k = 1;
  76.         }
  77.         else{
  78.             k = stoll(nmb);
  79.         }
  80.         char l = s[id];
  81.         v.push_back({k,l});
  82.  
  83.         id++;
  84.     }
  85.     if (sh){
  86.         see(v);
  87.     }
  88.     n = v.size();
  89.     vector <ll> pf(n);
  90.     pf[0] = v[0].first;
  91.     for (int i = 1; i < n; ++i){
  92.         pf[i] = pf[i-1] + v[i].first;
  93.     }
  94.  
  95.  
  96.  
  97.     //-->min : 2 x
  98.     //union
  99.     int xmn=-1;
  100.     vector <pair <ll, int> > un; //union: {-dif, x}
  101.     if (sh){
  102.         cout<<"Un filling\n";
  103.     }
  104.     for (int i = 0; i <= n - 3; ++i){
  105.         if (v[i].second == v[i+2].second && v[i+1].first == 1){//!!!
  106.                 ll bef, aft, dlt;
  107.                 bef = to_string(v[i].first).size() + to_string(v[i+2].first).size() + 3;
  108.                 aft = to_string(v[i].first + v[i+2].first).size() + 1;
  109.                 dlt = bef - aft;
  110.                 un.push_back({dlt, pf[i] + 1});
  111.  
  112.                 if (sh){
  113.                     cout<<"i = "<<i<<"\n";
  114.                     cout<<"bef = "<<bef<<"\n";
  115.                     cout<<"aft = "<<aft<<"\n";
  116.                     cout<<"dlt = "<<dlt<<"\n";
  117.                 }
  118.         }
  119.     }
  120.  
  121.     sort(un.begin(), un.end());
  122.     reverse(un.begin(), un.end());
  123.  
  124.     if (!un.empty()){
  125.  
  126.         if (sh){
  127.             cout<<"un is NOT EMPTY\n";
  128.             for (auto p: un){
  129.                 cout<<p.first<<' '<<p.second<<"\n";
  130.             }cout<<"\n";
  131.         }
  132.  
  133.         xmn = un[0].second;
  134.     }
  135.     else{
  136.  
  137.         if (sh) cout<<"un empty\n";
  138.  
  139.         for (int i = 0; i < n; ++i){
  140.             int k = v[i].first;
  141.             int lg = log10(k);
  142.             if (k == 1 || k == pow(10, lg) || k == 2){
  143.                 xmn = pf[i];//?
  144.                 break;
  145.             }
  146.         }
  147.     }
  148.     vector <ll>  ansmn = {2, xmn};
  149.  
  150.  
  151.  
  152.  
  153.     //-->max: 1 x z
  154.     //ruin
  155.     vector <char> ltr = {'A', 'G', 'C', 'T'};
  156.     char t;//разделительная буква
  157.     int xmx = -1;
  158.     vector < pair <ll, int> > ru;
  159.     if (sh){
  160.         cout<<"RU filling\n";
  161.     }
  162.  
  163.     for (int i = 0; i < n; ++i){
  164.         if (v[i].first >= 2){
  165.             //находим оптим a,b
  166.             ll a,b, ab = v[i].first;
  167.             int lg = log10(ab);
  168.  
  169.             for (int r = 0; r < 4; ++r){
  170.                 if (ltr[r] != v[i].second){
  171.                     t = ltr[r];
  172.                 }
  173.             }
  174.             ll A,B,C,D;
  175.             A = pow(10, lg);
  176.             B = ab - A;
  177.             C = ab / 2;
  178.             D = ab - C;
  179.             ll one = to_string(A).size() + to_string(B).size();
  180.             if (A == 1){
  181.                 one--;
  182.             }
  183.             if (B == 1){
  184.                 one--;
  185.             }
  186.  
  187.             ll two = to_string(C).size() + to_string(D).size();
  188.             if (C == 1){
  189.                 two--;
  190.             }
  191.             if (D == 1){
  192.                 two--;
  193.             }
  194.             if (one > two){//перессмотреть!!Избежать случая, где остается единичка!
  195.                 a = A;
  196.                 b = B;
  197.             }
  198.             else{
  199.                 a = C;
  200.                 b = D;
  201.             }
  202.  
  203.  
  204.             ll bef, aft, dlt;
  205.  
  206.             bef = to_string(ab).size() + 1;
  207.             aft = to_string(a).size() + to_string(b).size() + 3;
  208.             if (a == 1){
  209.                 aft--;
  210.             }
  211.             if (b == 1){
  212.                 aft--;
  213.             }
  214.  
  215.             dlt = aft - bef;
  216.             xmx = a;
  217.             if (i > 0){
  218.                 xmx += pf[i-1];
  219.             }
  220.             ru.push_back({dlt, xmx});
  221.  
  222.             if (sh){
  223.                 cout<<"i = "<<i<<"\n";
  224.                 cout<<" A B C D = "<<A<<' '<<B<<' '<<C<<' '<<D<<"\n";
  225.             }
  226.  
  227.         }
  228.     }
  229.  
  230.     sort(ru.begin(), ru.end());
  231.     reverse(ru.begin(), ru.end());
  232.  
  233.     if (!ru.empty()){
  234.  
  235.         if (sh){
  236.             cout<<"ru IS NOT EMPTY\n";
  237.             for (auto p: ru){
  238.                 cout<<p.first<<' '<<p.second<<"\n";
  239.             }
  240.         }
  241.  
  242.         xmx = ru[0].second;
  243.     }
  244.     else{
  245.  
  246.         if (sh) cout<<"ru empty\n";
  247.  
  248.         for (int i = 0; i < n; ++i){
  249.             ll k  = v[i].first;
  250.             int lg = log10(k);
  251.             if ( k + 1 == pow(10, lg + 1) || k == 1){
  252.                 xmx = pf[i];
  253.                 t = v[i].second;
  254.                 break;
  255.             }
  256.         }
  257.     }
  258.  
  259.     if (sh){
  260.         cout<<"ans min\n";
  261.     }
  262.     cvl(ansmn);
  263.  
  264.     if (sh){
  265.         cout<<"ans max\n";
  266.     }
  267.     cout<<1<<' '<<xmx<<' '<<t<<"\n";
  268. }
  269. /*
  270. 5AC5A2C
  271.  
  272. 2AC5A2C
  273.  
  274.  
  275. AG1111111GA999C
  276. 2 1
  277. 1 1000002 T
  278. */
  279.  
Add Comment
Please, Sign In to add comment