fork download
  1. #include <iostream>
  2. #include <cstring>
  3. #include <set>
  4. #include <vector>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. int main() {
  9. string current_number;
  10. string ansver = "";
  11. cin >> current_number;
  12. set<char> digits_set; // Инициализируем и заполняем множество со всеми цифрами начального числа
  13. for (int i = 0; i < current_number.size(); i++){
  14. char element = current_number[i];
  15. digits_set.insert(element);
  16. }
  17. std::vector<char> digits;
  18. for (char i : digits_set){
  19. digits.push_back(i);
  20. }
  21. std::reverse(digits.begin(), digits.end()); // Располагаем цифры в порядке убывания
  22. while (digits.size() != 1){ // Повторяем, пока не нашли все цифры кроме последней
  23. for (int i=0; i < digits.size(); i++){ // Перебираем цифры в порядке убывания
  24. char local_max = digits[i];
  25. int position = current_number.find(local_max);
  26. string new_number;
  27. for (int j = position; j < current_number.size(); j++){ // Делаем срез по элементу
  28. new_number += current_number[j];
  29. }
  30. set<char> digits_on_the_right;
  31. for (int j = 0; j < new_number.size(); j++){ // Находим цифры нового числа
  32. digits_on_the_right.insert(new_number[j]);
  33. }
  34. if (digits.size() == digits_on_the_right.size()){ // Проверяем, сохранится ли ранг ответа
  35. ansver += local_max;
  36. digits.erase(digits.begin() + i);
  37. string number_without_digit = "";
  38. for (int t = 0; t < new_number.size(); t++){ // Удаляем добавленную в ответ цифру из числа
  39. if (new_number[t] != local_max){
  40. number_without_digit += new_number[t];
  41. }
  42. }
  43. current_number = number_without_digit;
  44. break; // Останавливаем цикл, т.к. необходимая цифра на позицию уже найдена
  45. }
  46. }
  47. }
  48. cout << ansver + digits[0]; // Добавляем к ответу последнюю оставшуюся цифру
  49. return 0;
  50. }
Success #stdin #stdout 0s 4716KB
stdin
121323
stdout
213