#include <iostream>
#include <string>
#include <array>
#include <limits>
bool IsIsomorphic( std:: string const & s, std:: string const & t)
{
std:: array < char , std:: numeric_limits < char > :: max ( ) - std:: numeric_limits < char > :: min ( ) + 1 > arr = { } ;
for ( size_t i = 0 , n = s.length ( ) ; i < n; ++ i)
{
size_t pos = static_cast < size_t > ( s[ i] ) ;
if ( arr[ pos] == 0 )
{
arr[ pos] = t[ i] ;
continue ;
}
if ( arr[ pos] ! = t[ i] )
return false ;
}
return true ;
}
int main( )
{
// test
std:: string const ss[ 10 ] [ 2 ] =
{
{ "add" , "egg" } ,
{ "foo" , "bar" } ,
{ "paper" , "title" } ,
{ "aab" , "xyz" } ,
{ "aab" , "xxy" } ,
{ "abcd" , "aabb" } ,
{ "aaba" , "bbaa" } ,
{ "bbaa" , "aaba" } ,
{ "topcode" , "topcoat" } ,
{ "topcoat" , "topcode" }
} ;
for ( auto const & s : ss)
std:: cout
<< "\" " << s[ 0 ] << "\" "
<< ( IsIsomorphic( s[ 0 ] , s[ 1 ] ) ? " is isomorphic to " : " is NOT isomorphic to " )
<< "\" " << s[ 1 ] << "\" " << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxsaW1pdHM+Cgpib29sIElzSXNvbW9ycGhpYyhzdGQ6OnN0cmluZyBjb25zdCAmcywgc3RkOjpzdHJpbmcgY29uc3QgJnQpCnsKCXN0ZDo6YXJyYXk8Y2hhciwgc3RkOjpudW1lcmljX2xpbWl0czxjaGFyPjo6bWF4KCkgLSBzdGQ6Om51bWVyaWNfbGltaXRzPGNoYXI+OjptaW4oKSArIDE+IGFyciA9IHt9OwoKCWZvciAoc2l6ZV90IGkgPSAwLCBuID0gcy5sZW5ndGgoKTsgaSA8IG47ICsraSkKCXsKCQlzaXplX3QgcG9zID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzW2ldKTsKCgkJaWYgKGFycltwb3NdID09IDApCgkJewoJCQlhcnJbcG9zXSA9IHRbaV07CgkJCWNvbnRpbnVlOwoJCX0KCQkKCQlpZiAoYXJyW3Bvc10gIT0gdFtpXSkKCQkJcmV0dXJuIGZhbHNlOwoJfQoKCXJldHVybiB0cnVlOwp9CgppbnQgbWFpbigpCnsKCS8vIHRlc3QKCXN0ZDo6c3RyaW5nIGNvbnN0IHNzWzEwXVsyXSA9Cgl7CgkJeyAiYWRkIiwgImVnZyIgfSwKCQl7ICJmb28iLCAiYmFyIiB9LAoJCXsgInBhcGVyIiwgInRpdGxlIiB9LAoJCXsgImFhYiIsICJ4eXoiIH0sCgkJeyAiYWFiIiwgInh4eSIgfSwKCQl7ICJhYmNkIiwgImFhYmIiIH0sCgkJeyAiYWFiYSIsICJiYmFhIiB9LAoJCXsgImJiYWEiLCAiYWFiYSIgfSwKCQl7ICJ0b3Bjb2RlIiwgInRvcGNvYXQiIH0sCgkJeyAidG9wY29hdCIsICJ0b3Bjb2RlIiB9Cgl9OwoKCWZvciAoYXV0byBjb25zdCAmcyA6IHNzKQoJCXN0ZDo6Y291dCAKCQk8PCAiXCIiIDw8IHNbMF0gPDwgIlwiIiAKCQk8PCAoSXNJc29tb3JwaGljKHNbMF0sIHNbMV0pID8gIiBpcyBpc29tb3JwaGljIHRvICIgOiAiIGlzIE5PVCBpc29tb3JwaGljIHRvICIpIAoJCTw8ICJcIiIgPDwgc1sxXSA8PCAiXCIiIDw8IHN0ZDo6ZW5kbDsKCglyZXR1cm4gMDsKfQ==