Advertisement
paranid5

Число-палиндром

Aug 4th, 2020 (edited)
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. /*
  2. Число-палиндром
  3. Напишите программу, которая составляет из цифр введённой строки число-палиндром (число, которое читается одинаково слева направо и справа налево) максимальной длины. Если таких чисел несколько, нужно вывести минимальное из них. Все имеющиеся цифры использовать не обязательно, но количество цифр в ответе должно быть максимально возможным.
  4.  
  5. Входные данные
  6.  
  7. Входная строка содержит цифры (по крайней мере, одну) и, возможно, другие символы. Длина строки не превосходит 10000 символов.
  8.  
  9. Выходные данные
  10.  
  11. Программа должна вывести число-палиндром максимальной длины, которое можно составить из цифр входной строки.
  12.  
  13. Примеры
  14. Ввод for i:=99921 downto 2
  15. Вывод 29192
  16. */
  17.  
  18. #include <iostream>
  19. #include <string>
  20. #include <map>
  21. #include <list>
  22. #include <vector>
  23.  
  24. int main()
  25. {
  26.     std::string input;
  27.     std::getline(std::cin, input);
  28.     std::map<char, int> collect;
  29.     std::list<char> ans;
  30.     bool can = false;
  31.    
  32.     for (char i : input)
  33.     {
  34.         if (i > 47 && i < 58)
  35.         {
  36.             if (collect.find(i) != collect.end())
  37.             {
  38.                 collect[i]++;
  39.                 if (i != '0')
  40.                     can = true;
  41.             }
  42.             else
  43.                 collect.insert({i, 1});
  44.         }
  45.     }
  46.    
  47.     auto it_ans = ans.begin();
  48.     auto it_collect = collect.begin();
  49.    
  50.     auto place = [&ans, &it_ans](std::map<char, int>::iterator it_collect)
  51.     {
  52.         ans.insert(it_ans, (it_collect->first));
  53.         --it_ans;
  54.         ans.insert(it_ans, (it_collect->first));
  55.     };
  56.    
  57.     if (collect.begin()->first == '0')
  58.     {
  59.         if (collect.size() == 1 || !can)
  60.         {
  61.             putchar('0');
  62.             return 0;
  63.         }
  64.         auto iter = std::next(collect.begin());
  65.         while (iter->second == 1) ++iter;
  66.         place(iter);
  67.         iter->second -= 2;
  68.     }
  69.    
  70.     while (!collect.empty())
  71.     {
  72.         if (it_collect == collect.end())
  73.         {
  74.             ans.insert(it_ans, collect.begin()->first);
  75.             break;
  76.         }
  77.         if (it_collect->second % 2 == 0)
  78.         {
  79.             for (int i = 0; i < it_collect->second; i += 2)
  80.                 place(it_collect);
  81.             collect.erase(it_collect++);
  82.         }
  83.         else
  84.         {
  85.             if (it_collect->second > 1)
  86.             {
  87.                 int i = 0;
  88.                 for (; i < it_collect->second - 1; i += 2)
  89.                     place(it_collect);
  90.                 it_collect->second -= i;
  91.                 ++it_collect;
  92.             }
  93.             else ++it_collect;
  94.         }
  95.     }
  96.    
  97.     std::vector<char> ans_vec(ans.size());
  98.     std::move(ans.begin(), ans.end(), ans_vec.begin());
  99.    
  100.     for (char i : ans_vec)
  101.         std::printf("%c", i);
  102.    
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement