#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<array>
#include<list>
template < typename T1 >
std::unordered_map< int, int > count_frequency( T1 first, T1 last )
{
std::unordered_map< int, int > temp_unordered_map;
auto temp_unordered_map_end = std::end( temp_unordered_map );
while( first != last )
{
auto it_temp_unordered_map = temp_unordered_map.find( *first );
if( it_temp_unordered_map == temp_unordered_map_end )
{
temp_unordered_map.emplace( *first, 1 );
}
else
{
++( it_temp_unordered_map->second );
}
++first;
}
return temp_unordered_map;
}
template < typename T1, typename T2 >
bool is_permutation( const T1 first1, const T1 last1, const T2 first2, const T2 last2 )
{
return count_frequency( first1, last1 )== count_frequency( first2, last2 );
}
int main()
{
const std::array< int, 5> array1 { { 1, 3, 2, 4, 5 } };
const std::array<int,4> array2 { { 1, 2, 4, 3 } };
if( ::is_permutation( std::begin( array1 ), std::end( array1 ), std::begin( array2 ), std::end( array2 ) ) )
{
std::cout<< " Elements are permutation of each other\n";
}
else
{
std::cout<< " Elements are not permutation of each other\n";
}
const std::vector< int > vec1 { { 1, 3, 2, 4 } };
const std::vector< int > vec2 { { 1, 2, 4, 3 } };
if( ::is_permutation( std::begin( vec1 ), std::end( vec1 ), std::begin( vec2 ), std::end( vec2 ) ) )
{
std::cout<< " Elements are permutation of each other\n";
}
else
{
std::cout<< " Elements are not permutation of each other\n";
}
const std::list< int > list1 { { 1, 3, 2, 4 } };
const std::list< int > list2 { { 1, 2, 4, 3 } };
if( ::is_permutation( std::begin( list1 ), std::end( list1 ), std::begin( list2 ), std::end( list2 ) ) )
{
std::cout<< " Elements are permutation of each other\n";
}
else
{
std::cout<< " Elements are not permutation of each other\n";
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGU8YXJyYXk+CiNpbmNsdWRlPGxpc3Q+Cgp0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxID4Kc3RkOjp1bm9yZGVyZWRfbWFwPCBpbnQsIGludCA+IGNvdW50X2ZyZXF1ZW5jeSggVDEgZmlyc3QsIFQxIGxhc3QgKQp7CiAgICBzdGQ6OnVub3JkZXJlZF9tYXA8IGludCwgaW50ID4gdGVtcF91bm9yZGVyZWRfbWFwOwogICAgYXV0byB0ZW1wX3Vub3JkZXJlZF9tYXBfZW5kID0gc3RkOjplbmQoIHRlbXBfdW5vcmRlcmVkX21hcCApOwogICAgd2hpbGUoIGZpcnN0ICE9IGxhc3QgKQogICAgewogICAgICAgIGF1dG8gaXRfdGVtcF91bm9yZGVyZWRfbWFwID0gdGVtcF91bm9yZGVyZWRfbWFwLmZpbmQoICpmaXJzdCApOwogICAgICAgIGlmKCBpdF90ZW1wX3Vub3JkZXJlZF9tYXAgPT0gdGVtcF91bm9yZGVyZWRfbWFwX2VuZCApCiAgICAgICAgewogICAgICAgICAgICB0ZW1wX3Vub3JkZXJlZF9tYXAuZW1wbGFjZSggKmZpcnN0LCAxICk7ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgKysoIGl0X3RlbXBfdW5vcmRlcmVkX21hcC0+c2Vjb25kICk7CiAgICAgICAgfQogICAgICAgICsrZmlyc3Q7CiAgICB9CiAgICByZXR1cm4gdGVtcF91bm9yZGVyZWRfbWFwOwp9Cgp0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CmJvb2wgaXNfcGVybXV0YXRpb24oIGNvbnN0IFQxIGZpcnN0MSwgY29uc3QgVDEgbGFzdDEsIGNvbnN0IFQyIGZpcnN0MiwgY29uc3QgVDIgbGFzdDIgKQp7ICAgCiAgICByZXR1cm4gY291bnRfZnJlcXVlbmN5KCBmaXJzdDEsIGxhc3QxICk9PSBjb3VudF9mcmVxdWVuY3koIGZpcnN0MiwgbGFzdDIgKTsKCn0KCmludCBtYWluKCkKeyAgICAgCiAgICBjb25zdCBzdGQ6OmFycmF5PCBpbnQsIDU+IGFycmF5MSB7IHsgMSwgMywgMiwgNCwgNSB9IH07CiAgICBjb25zdCBzdGQ6OmFycmF5PGludCw0PiBhcnJheTIgeyB7IDEsIDIsIDQsIDMgfSB9OwoKICAgIGlmKCA6OmlzX3Blcm11dGF0aW9uKCBzdGQ6OmJlZ2luKCBhcnJheTEgKSwgc3RkOjplbmQoIGFycmF5MSApLCBzdGQ6OmJlZ2luKCBhcnJheTIgKSwgc3RkOjplbmQoIGFycmF5MiApICkgKQogICAgewogICAgICAgIHN0ZDo6Y291dDw8ICIgRWxlbWVudHMgYXJlIHBlcm11dGF0aW9uIG9mIGVhY2ggb3RoZXJcbiI7IAogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHN0ZDo6Y291dDw8ICIgRWxlbWVudHMgYXJlIG5vdCBwZXJtdXRhdGlvbiBvZiBlYWNoIG90aGVyXG4iOwogICAgfQoKICAgIGNvbnN0IHN0ZDo6dmVjdG9yPCBpbnQgPiB2ZWMxIHsgeyAxLCAzLCAyLCA0IH0gfTsKICAgIGNvbnN0IHN0ZDo6dmVjdG9yPCBpbnQgPiB2ZWMyIHsgeyAxLCAyLCA0LCAzIH0gfTsKCiAgICBpZiggOjppc19wZXJtdXRhdGlvbiggc3RkOjpiZWdpbiggdmVjMSApLCBzdGQ6OmVuZCggdmVjMSApLCBzdGQ6OmJlZ2luKCB2ZWMyICksIHN0ZDo6ZW5kKCB2ZWMyICkgKSApCiAgICB7CiAgICAgICAgc3RkOjpjb3V0PDwgIiBFbGVtZW50cyBhcmUgcGVybXV0YXRpb24gb2YgZWFjaCBvdGhlclxuIjsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RkOjpjb3V0PDwgIiBFbGVtZW50cyBhcmUgbm90IHBlcm11dGF0aW9uIG9mIGVhY2ggb3RoZXJcbiI7CiAgICB9CgogICAgY29uc3Qgc3RkOjpsaXN0PCBpbnQgPiBsaXN0MSB7IHsgMSwgMywgMiwgNCB9IH07CiAgICBjb25zdCBzdGQ6Omxpc3Q8IGludCA+IGxpc3QyIHsgeyAxLCAyLCA0LCAzIH0gfTsKCiAgICBpZiggOjppc19wZXJtdXRhdGlvbiggc3RkOjpiZWdpbiggbGlzdDEgKSwgc3RkOjplbmQoIGxpc3QxICksIHN0ZDo6YmVnaW4oIGxpc3QyICksIHN0ZDo6ZW5kKCBsaXN0MiApICkgKQogICAgewogICAgICAgIHN0ZDo6Y291dDw8ICIgRWxlbWVudHMgYXJlIHBlcm11dGF0aW9uIG9mIGVhY2ggb3RoZXJcbiI7IAogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHN0ZDo6Y291dDw8ICIgRWxlbWVudHMgYXJlIG5vdCBwZXJtdXRhdGlvbiBvZiBlYWNoIG90aGVyXG4iOwogICAgfQogICAgcmV0dXJuIDA7Cn0=