#include <vector>
#include <string>
#include <iostream>
#include <iterator>
#include <algorithm>
using SetOfWords = std::vector<std::string>;
void ShowUserInputWordsMessage(size_t number_of_words) {
std::cout << "Please fill sets with " << number_of_words << " words\n";
}
std::vector<std::string> GetFilledSetOfWords(size_t number_of_words) {
ShowUserInputWordsMessage(number_of_words);
std::vector<std::string> words_set(number_of_words);
std::copy_n(std::istream_iterator<std::string>(std::cin), number_of_words,
std::back_inserter(words_set));
return words_set;
}
void ShowSet(const SetOfWords &set) {
std::copy(set.begin(), set.end(),
std::ostream_iterator<std::string>(std::cout, " "));
std::cout << '\n';
}
void ShowIsPermutationMessage(bool is_permutation) {
std::cout << "is" << (is_permutation ? " " : " not ") << "permutation of\n";
}
bool IsPermutation(const SetOfWords &first, const SetOfWords &second) {
return std::is_permutation(first.begin(), first.end(), second.begin());
}
void ShowIsPermutationSets(const SetOfWords &first, const SetOfWords &second) {
ShowSet(first);
ShowIsPermutationMessage(IsPermutation(first, second));
ShowSet(second);
}
int main() {
const size_t kNumberOfWordsInSet = 12;
ShowIsPermutationSets(GetFilledSetOfWords(kNumberOfWordsInSet),
GetFilledSetOfWords(kNumberOfWordsInSet));
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp1c2luZyBTZXRPZldvcmRzID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+OwoKdm9pZCBTaG93VXNlcklucHV0V29yZHNNZXNzYWdlKHNpemVfdCBudW1iZXJfb2Zfd29yZHMpIHsKICBzdGQ6OmNvdXQgPDwgIlBsZWFzZSBmaWxsIHNldHMgd2l0aCAiIDw8IG51bWJlcl9vZl93b3JkcyA8PCAiIHdvcmRzXG4iOwp9CgpzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0RmlsbGVkU2V0T2ZXb3JkcyhzaXplX3QgbnVtYmVyX29mX3dvcmRzKSB7CiAgU2hvd1VzZXJJbnB1dFdvcmRzTWVzc2FnZShudW1iZXJfb2Zfd29yZHMpOwogIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB3b3Jkc19zZXQobnVtYmVyX29mX3dvcmRzKTsKICBzdGQ6OmNvcHlfbihzdGQ6OmlzdHJlYW1faXRlcmF0b3I8c3RkOjpzdHJpbmc+KHN0ZDo6Y2luKSwgbnVtYmVyX29mX3dvcmRzLAogICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih3b3Jkc19zZXQpKTsKICByZXR1cm4gd29yZHNfc2V0Owp9Cgp2b2lkIFNob3dTZXQoY29uc3QgU2V0T2ZXb3JkcyAmc2V0KSB7CiAgc3RkOjpjb3B5KHNldC5iZWdpbigpLCBzZXQuZW5kKCksCiAgICAgICAgICAgIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxzdGQ6OnN0cmluZz4oc3RkOjpjb3V0LCAiICIpKTsKICBzdGQ6OmNvdXQgPDwgJ1xuJzsKfQoKdm9pZCBTaG93SXNQZXJtdXRhdGlvbk1lc3NhZ2UoYm9vbCBpc19wZXJtdXRhdGlvbikgewogIHN0ZDo6Y291dCA8PCAiaXMiIDw8IChpc19wZXJtdXRhdGlvbiA/ICIgIiA6ICIgbm90ICIpIDw8ICJwZXJtdXRhdGlvbiBvZlxuIjsKfQoKYm9vbCBJc1Blcm11dGF0aW9uKGNvbnN0IFNldE9mV29yZHMgJmZpcnN0LCBjb25zdCBTZXRPZldvcmRzICZzZWNvbmQpIHsKICByZXR1cm4gc3RkOjppc19wZXJtdXRhdGlvbihmaXJzdC5iZWdpbigpLCBmaXJzdC5lbmQoKSwgc2Vjb25kLmJlZ2luKCkpOwp9Cgp2b2lkIFNob3dJc1Blcm11dGF0aW9uU2V0cyhjb25zdCBTZXRPZldvcmRzICZmaXJzdCwgY29uc3QgU2V0T2ZXb3JkcyAmc2Vjb25kKSB7CiAgU2hvd1NldChmaXJzdCk7CiAgU2hvd0lzUGVybXV0YXRpb25NZXNzYWdlKElzUGVybXV0YXRpb24oZmlyc3QsIHNlY29uZCkpOwogIFNob3dTZXQoc2Vjb25kKTsKfQoKaW50IG1haW4oKSB7CiAgY29uc3Qgc2l6ZV90IGtOdW1iZXJPZldvcmRzSW5TZXQgPSAxMjsKICBTaG93SXNQZXJtdXRhdGlvblNldHMoR2V0RmlsbGVkU2V0T2ZXb3JkcyhrTnVtYmVyT2ZXb3Jkc0luU2V0KSwKICAgICAgICAgICAgICAgICAgICAgICAgR2V0RmlsbGVkU2V0T2ZXb3JkcyhrTnVtYmVyT2ZXb3Jkc0luU2V0KSk7CiAgcmV0dXJuIDA7Cn0=