fork download
  1. /*
  2. お題:1のビットが3個ある二進表記文字列が与えられたとき、次に大きい
  3. 1のビットが3個ある二進表記文字列を求める。
  4. 111 -> 1011
  5. 1110 -> 10011
  6. 101100 -> 110001
  7. */
  8.  
  9. #include <iostream>
  10. #include <string>
  11. #include <algorithm>
  12.  
  13. using namespace std;
  14.  
  15. string f623(string s)
  16. {
  17. const int len = s.length();
  18. const int c0 = count(s.begin(), s.end(), '0');
  19. const int c1 = count(s.begin(), s.end(), '1');
  20. if (s.empty() || s[0] != '1' || c0 + c1 != len) {
  21. return "INVALID";
  22. }
  23. for (int i = len - 1; i > 0; --i) {
  24. if (s[i - 1] == '0' && s[i] == '1') {
  25. return s.substr(0, i - 1) + f623(s.substr(i));
  26. }
  27. }
  28. return '1' + string(c0 + 1, '0') + string(c1 - 1, '1');
  29. }
  30.  
  31. int main()
  32. {
  33. for (string s; cin >> s; ) {
  34. cout << s << " -> " << f623(s) << endl;
  35. }
  36. }
  37.  
Success #stdin #stdout 0s 3480KB
stdin
111
1110
101100
stdout
111 -> 1011
1110 -> 10011
101100 -> 110001