#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <sstream>
/*
s1 = "red blue blue red red yellow"
s2 = "abbaac"
This would match because they have the same pattern.
*/
typedef std:: map < size_t ,size_t > hash_map;
typedef std:: vector < std:: string > wordlist;
size_t ordered_symbol( hash_map & h, std:: string const & word )
{
std:: hash < std:: string > hash_fn;
size_t hash = hash_fn( word) ;
if ( h.find ( hash) == h.end ( ) )
{
size_t const sequence = h.size ( ) ;
h[ hash] = sequence;
return sequence;
}
return h[ hash] ;
}
wordlist create_wordlist( std:: string const & str )
{
if ( str.find_first_of ( ' ' ) ! = std:: string :: npos )
{
wordlist w1;
std:: stringstream sstr( str) ;
std:: string s;
while ( sstr>> s)
w1.push_back ( s) ;
return w1;
}
wordlist w2;
for ( auto i : str)
{
std:: string s;
s.append ( 1 ,i) ;
w2.push_back ( s) ;
}
return w2;
}
bool pattern_matches( std:: string const & s1, std:: string const & s2 )
{
wordlist const w1 = create_wordlist( s1) ;
wordlist const w2 = create_wordlist( s2) ;
if ( w1.size ( ) ! = w2.size ( ) )
return false ;
hash_map h1,h2;
for ( size_t i = 0 ; i! = w1.size ( ) ; ++ i)
if ( ordered_symbol( h1,w1[ i] ) ! = ordered_symbol( h2,w2[ i] ) )
return false ;
return true ;
}
void test( std:: string const & s1, std:: string const & s2 )
{
std:: cout << "[" << s1<< "] "
<< ( pattern_matches( s1,s2) ? "<==>" : "<=!=>" )
<< "[" << s2<< "]\n " ;
}
int main( )
{
test( "red blue blue red red yellow" ,"abbaac" ) ;
test( "red blue blue red red yellow" ,"first second second first first third" ) ;
test( "abbaac" ,"12211g" ) ;
test( "abbaac" ,"red blue blue red red yellow" ) ;
test( "abbgac" ,"red blue blue red red yellow" ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3N0cmVhbT4KLyoKczEgPSAicmVkIGJsdWUgYmx1ZSByZWQgcmVkIHllbGxvdyIKczIgPSAiYWJiYWFjIgpUaGlzIHdvdWxkIG1hdGNoIGJlY2F1c2UgdGhleSBoYXZlIHRoZSBzYW1lIHBhdHRlcm4uCiovCnR5cGVkZWYgc3RkOjptYXA8c2l6ZV90LHNpemVfdD4gaGFzaF9tYXA7CnR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHdvcmRsaXN0OwoKc2l6ZV90IG9yZGVyZWRfc3ltYm9sKCBoYXNoX21hcCAmaCwgc3RkOjpzdHJpbmcgY29uc3QmIHdvcmQgKQp7CiAgICBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+IGhhc2hfZm47CiAgICBzaXplX3QgaGFzaCA9IGhhc2hfZm4od29yZCk7CiAgICBpZihoLmZpbmQoaGFzaCk9PWguZW5kKCkpCiAgICB7CiAgICAgICAgc2l6ZV90IGNvbnN0IHNlcXVlbmNlID0gaC5zaXplKCk7CiAgICAgICAgaFtoYXNoXSA9IHNlcXVlbmNlOwogICAgICAgIHJldHVybiBzZXF1ZW5jZTsKICAgIH0KICAgIHJldHVybiBoW2hhc2hdOwp9Cgp3b3JkbGlzdCBjcmVhdGVfd29yZGxpc3QoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKQp7CiAgICBpZihzdHIuZmluZF9maXJzdF9vZignICcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQogICAgewogICAgICAgIHdvcmRsaXN0IHcxOwogICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHIoc3RyKTsKICAgICAgICBzdGQ6OnN0cmluZyBzOwogICAgICAgIHdoaWxlKHNzdHI+PnMpCiAgICAgICAgICAgIHcxLnB1c2hfYmFjayhzKTsKICAgICAgICByZXR1cm4gdzE7ICAgICAgICAKICAgIH0KICAgIHdvcmRsaXN0IHcyOwogICAgZm9yKGF1dG8gaSA6IHN0cikKICAgIHsKICAgICAgICBzdGQ6OnN0cmluZyBzOwogICAgICAgIHMuYXBwZW5kKDEsaSk7CiAgICAgICAgdzIucHVzaF9iYWNrKHMpOwogICAgfQogICAgcmV0dXJuIHcyOwp9Cgpib29sIHBhdHRlcm5fbWF0Y2hlcyggc3RkOjpzdHJpbmcgY29uc3QmIHMxLCBzdGQ6OnN0cmluZyBjb25zdCYgczIgKQp7CiAgICB3b3JkbGlzdCBjb25zdCB3MSA9IGNyZWF0ZV93b3JkbGlzdChzMSk7CiAgICB3b3JkbGlzdCBjb25zdCB3MiA9IGNyZWF0ZV93b3JkbGlzdChzMik7CiAgICBpZih3MS5zaXplKCkhPXcyLnNpemUoKSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBoYXNoX21hcCBoMSxoMjsKICAgIGZvciggc2l6ZV90IGkgPSAwOyBpIT13MS5zaXplKCk7ICsraSkKICAgICAgICBpZihvcmRlcmVkX3N5bWJvbChoMSx3MVtpXSkhPW9yZGVyZWRfc3ltYm9sKGgyLHcyW2ldKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7Cn0KCnZvaWQgdGVzdCggc3RkOjpzdHJpbmcgY29uc3QmIHMxLCBzdGQ6OnN0cmluZyBjb25zdCYgczIgKQp7CiAgICBzdGQ6OmNvdXQ8PCJbIjw8czE8PCJdICIKICAgICAgICAgICAgIDw8KHBhdHRlcm5fbWF0Y2hlcyhzMSxzMik/ICI8PT0+IiA6ICI8PSE9PiIpCiAgICAgICAgICAgICA8PCJbIjw8czI8PCJdXG4iOyAgICAKfQoKaW50IG1haW4oKQp7CiAgICB0ZXN0KCJyZWQgYmx1ZSBibHVlIHJlZCByZWQgeWVsbG93IiwiYWJiYWFjIik7CiAgICB0ZXN0KCJyZWQgYmx1ZSBibHVlIHJlZCByZWQgeWVsbG93IiwiZmlyc3Qgc2Vjb25kIHNlY29uZCBmaXJzdCBmaXJzdCB0aGlyZCIpOwogICAgdGVzdCgiYWJiYWFjIiwiMTIyMTFnIik7CiAgICB0ZXN0KCJhYmJhYWMiLCJyZWQgYmx1ZSBibHVlIHJlZCByZWQgeWVsbG93Iik7CiAgICB0ZXN0KCJhYmJnYWMiLCJyZWQgYmx1ZSBibHVlIHJlZCByZWQgeWVsbG93Iik7CiAgICByZXR1cm4gMDsKfQ==