#include <algorithm>
#include <numeric>
#include <iostream>
#include <vector>
std::size_t hamming_distance(const std::string& s1, const std::string& s2)
{
std::size_t res = 0;
for (std::size_t i = 0; i != s1.size(); ++i) {
res += s1[i] != s2[i];
}
return res;
#if 0 // C++17
return std::transform_reduce(
s1.begin(), s1.end(),
s2.begin(),
0u,
std::not_equal_to<>{},
std::plus<>{});
#endif
}
bool isAnRearrangement(const std::vector<std::string>& v)
{
return std::adjacent_find(v.begin(), v.end(),
[](const std::string& s1, const std::string& s2){
return hamming_distance(s1, s2) != 1;
}) == v.end();
}
bool stringsRearrangement(std::vector<std::string> v) {
std::sort(v.begin(), v.end());
do {
if (isAnRearrangement(v)) {
return true;
}
} while (std::next_permutation(v.begin(),v.end()));
return false;
}
int main(int, char*[])
{
std::cout << stringsRearrangement({"aba", "bbb", "bab"}) << std::endl; // false
std::cout << stringsRearrangement({"a", "b", "c"}) << std::endl; // true
std::cout << stringsRearrangement({"a", "b", "c"}) << std::endl; // true
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnN0ZDo6c2l6ZV90IGhhbW1pbmdfZGlzdGFuY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHMxLCBjb25zdCBzdGQ6OnN0cmluZyYgczIpCnsKICAgIHN0ZDo6c2l6ZV90IHJlcyA9IDA7CiAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpICE9IHMxLnNpemUoKTsgKytpKSB7CiAgICAgICAgcmVzICs9IHMxW2ldICE9IHMyW2ldOwogICAgfQogICAgcmV0dXJuIHJlczsKI2lmIDAgLy8gQysrMTcKICAgIHJldHVybiBzdGQ6OnRyYW5zZm9ybV9yZWR1Y2UoCiAgICAgICAgczEuYmVnaW4oKSwgczEuZW5kKCksCiAgICAgICAgczIuYmVnaW4oKSwKICAgICAgICAwdSwKICAgICAgICBzdGQ6Om5vdF9lcXVhbF90bzw+e30sCiAgICAgICAgc3RkOjpwbHVzPD57fSk7CiNlbmRpZgp9Cgpib29sIGlzQW5SZWFycmFuZ2VtZW50KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdikKewogICAgcmV0dXJuIHN0ZDo6YWRqYWNlbnRfZmluZCh2LmJlZ2luKCksIHYuZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzMSwgY29uc3Qgc3RkOjpzdHJpbmcmIHMyKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW1taW5nX2Rpc3RhbmNlKHMxLCBzMikgIT0gMTsgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT0gdi5lbmQoKTsKfQoKCmJvb2wgc3RyaW5nc1JlYXJyYW5nZW1lbnQoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHYpIHsKICAgIHN0ZDo6c29ydCh2LmJlZ2luKCksIHYuZW5kKCkpOwogICAgZG8gewogICAgICAgIGlmIChpc0FuUmVhcnJhbmdlbWVudCh2KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9IHdoaWxlIChzdGQ6Om5leHRfcGVybXV0YXRpb24odi5iZWdpbigpLHYuZW5kKCkpKTsKICAgIHJldHVybiBmYWxzZTsKfQoKaW50IG1haW4oaW50LCBjaGFyKltdKQp7CiAgICBzdGQ6OmNvdXQgPDwgc3RyaW5nc1JlYXJyYW5nZW1lbnQoeyJhYmEiLCAiYmJiIiwgImJhYiJ9KSA8PCBzdGQ6OmVuZGw7IC8vIGZhbHNlCiAgICBzdGQ6OmNvdXQgPDwgc3RyaW5nc1JlYXJyYW5nZW1lbnQoeyJhIiwgImIiLCAiYyJ9KSA8PCBzdGQ6OmVuZGw7IC8vIHRydWUKICAgIHN0ZDo6Y291dCA8PCBzdHJpbmdzUmVhcnJhbmdlbWVudCh7ImEiLCAiYiIsICJjIn0pIDw8IHN0ZDo6ZW5kbDsgLy8gdHJ1ZQp9Cg==