fork(2) download
  1. #include <algorithm>
  2. #include <numeric>
  3. #include <iostream>
  4. #include <vector>
  5.  
  6. std::size_t hamming_distance(const std::string& s1, const std::string& s2)
  7. {
  8. std::size_t res = 0;
  9. for (std::size_t i = 0; i != s1.size(); ++i) {
  10. res += s1[i] != s2[i];
  11. }
  12. return res;
  13. #if 0 // C++17
  14. return std::transform_reduce(
  15. s1.begin(), s1.end(),
  16. s2.begin(),
  17. 0u,
  18. std::not_equal_to<>{},
  19. std::plus<>{});
  20. #endif
  21. }
  22.  
  23. bool isAnRearrangement(const std::vector<std::string>& v)
  24. {
  25. return std::adjacent_find(v.begin(), v.end(),
  26. [](const std::string& s1, const std::string& s2){
  27. return hamming_distance(s1, s2) != 1;
  28. }) == v.end();
  29. }
  30.  
  31.  
  32. bool stringsRearrangement(std::vector<std::string> v) {
  33. std::sort(v.begin(), v.end());
  34. do {
  35. if (isAnRearrangement(v)) {
  36. return true;
  37. }
  38. } while (std::next_permutation(v.begin(),v.end()));
  39. return false;
  40. }
  41.  
  42. int main(int, char*[])
  43. {
  44. std::cout << stringsRearrangement({"aba", "bbb", "bab"}) << std::endl; // false
  45. std::cout << stringsRearrangement({"a", "b", "c"}) << std::endl; // true
  46. std::cout << stringsRearrangement({"a", "b", "c"}) << std::endl; // true
  47. }
  48.  
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
0
1
1