rakcode1998

Untitled

Mar 28th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef long double ld;
  5.  
  6. #define ipow(a,b)+0.5 (int)pow(a,b)
  7. #define pb push_back
  8. #define mp make_pair
  9. #define mod 1000000007
  10. #define fi first
  11. #define se second
  12.  
  13. #define rep(i,n) for(int i=0;i<n;i++)
  14. #define reps(i,a,b) for(int i=a;i<=b;i++)
  15.  
  16. string s;
  17. bool vis[100005]={false};
  18. int b[100005];
  19. multiset<int>re;
  20. map<int,int>ret;
  21. vector<int>store[100005];
  22. multiset<int>rem[3];
  23.  
  24. class Task
  25. {
  26. public:
  27.     void solve(istream& in,ostream& out)
  28.     {
  29.           in>>s;
  30.           ll S=sum();
  31.  
  32.           int n=s.length();
  33.           bool flag=false;
  34.           int y=0;
  35.  
  36.           rep(i,n)
  37.           {
  38.                b[i]=s[i]-48;
  39.                if(ret.find(b[i])==ret.end())
  40.                {
  41.                      ret.insert(mp(b[i],y));
  42.                      store[y].push_back(i);
  43.                      y++;
  44.                }
  45.                else
  46.                {
  47.                      int k=(*ret.find(b[i])).se;
  48.                      store[k].pb(i);
  49.                }
  50.           }
  51.  
  52.           sort(b,b+n);
  53.           int store=-182;
  54.  
  55.           if(S%3==0)
  56.           out<<s;
  57.           else
  58.           {
  59.                for(int i=0;i<n;i++)
  60.                {
  61.                     if(b[i]%3==0)
  62.                     rem[0].insert(b[i]);
  63.                     else if (b[i]%3==1)
  64.                     rem[1].insert(b[i]);
  65.                     else
  66.                     rem[2].insert(b[i]);
  67.                }
  68.  
  69.                if(S%3==1)
  70.                {
  71.                     if(rem[1].size()>0)
  72.                     {
  73.                          re.insert(*rem[1].begin());
  74.                          flag=true;
  75.                     }
  76.                }
  77.  
  78.                else if (S%3==2)
  79.                {
  80.                     if(rem[2].size()>0)
  81.                     {
  82.                          re.insert(*rem[2].begin());
  83.                          flag=true;
  84.                     }
  85.                     else if (rem[1].size()>=2)
  86.                     {
  87.                          re.insert(*rem[1].begin());
  88.                          re.insert(*next(rem[1].begin()));
  89.                          flag=true;
  90.                     }
  91.                }
  92.  
  93.                if(!flag)
  94.                out<<-1<<endl;
  95.                else
  96.                {
  97.                     if(re.size()==1)
  98.                     {
  99.                          auto it = re.begin();
  100.                          int k=(*ret.find(*it)).se;
  101.                          int c1=store[k][0];
  102.                          vis[c1]=true;
  103.                     }
  104.  
  105.                     else
  106.                     {
  107.                          auto it=re.begin();
  108.                          if(*it==(*next(it)))
  109.                          {
  110.                               auto it = re.begin();
  111.                               int k=(*ret.find(*it)).se;
  112.                               vis[store[k][0]]=true;
  113.                               vis[store[k][1]]=true;
  114.                          }
  115.                     }
  116.  
  117.                     leading(n);
  118.  
  119.                     for(int i=0;i<n;i++)
  120.                     {
  121.                          if(!vis[i])
  122.                          out<<s[i];
  123.                     }
  124.  
  125.                     out<<endl;
  126.                }
  127.           }
  128.     }
  129.  
  130.     void leading(int n)
  131.     {
  132.           if(vis[0]==false)
  133.           return ;
  134.           else
  135.           {
  136.                reps(i,1,n-1)
  137.                {
  138.                     if(s[i]=='0')
  139.                     vis[i]=true;
  140.                     else
  141.                     break;
  142.                }
  143.           }
  144.     }
  145.  
  146.     ll sum()
  147.     {
  148.           ll res=0;
  149.           int n=s.length();
  150.  
  151.           rep(i,n)
  152.           {
  153.                res+=s[i]-48;
  154.           }
  155.  
  156.           return res;
  157.     }
  158. };
  159.  
  160.  
  161. int main()
  162. {
  163.     ios_base::sync_with_stdio(false);
  164.     cin.tie(NULL);
  165.     cout.tie(NULL);
  166.     Task solver;
  167.     std::istream& in(std::cin);
  168.     std::ostream& out(std::cout);
  169.     solver.solve(in,out);
  170.     out.flush();
  171.  
  172.       return 0;
  173. }
Add Comment
Please, Sign In to add comment