#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <sstream>
bool findMatch(char * s1, std::string s2){
std::map<char, std::string> letter_to_word;
std::set<std::string> words_seen;
std::istringstream iss(s1);
std::string word;
for (std::string::size_type i = 0; i < s2.size(); ++i)
{
if (!(iss >> word))
return false; // more letters than words
std::string& expected_word = letter_to_word[s2[i]];
if (expected_word == "")
{
// if different letters require different words...
if (words_seen.find(word) != words_seen.end())
return false; // multiple letters for same word
words_seen.insert(word);
expected_word = word; // first time we've seen letter, remember associated word
}
else if (expected_word != word)
return false; // different word for same letter
}
return !(iss >> word); // check no surplus words
}
int main(int argc, char * argv[]){
bool b = findMatch("red blue blue red red yellow yellow", "abbaacd");
std::cout << b << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3N0cmVhbT4KCmJvb2wgZmluZE1hdGNoKGNoYXIgKiBzMSwgc3RkOjpzdHJpbmcgczIpewogICAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+IGxldHRlcl90b193b3JkOwogICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHdvcmRzX3NlZW47CiAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gaXNzKHMxKTsKICAgIHN0ZDo6c3RyaW5nIHdvcmQ7CiAgICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBzMi5zaXplKCk7ICsraSkKICAgIHsKICAgICAgICBpZiAoIShpc3MgPj4gd29yZCkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbW9yZSBsZXR0ZXJzIHRoYW4gd29yZHMKICAgICAgICBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfd29yZCA9IGxldHRlcl90b193b3JkW3MyW2ldXTsKICAgICAgICBpZiAoZXhwZWN0ZWRfd29yZCA9PSAiIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIGRpZmZlcmVudCBsZXR0ZXJzIHJlcXVpcmUgZGlmZmVyZW50IHdvcmRzLi4uCiAgICAgICAgICAgIGlmICh3b3Jkc19zZWVuLmZpbmQod29yZCkgIT0gd29yZHNfc2Vlbi5lbmQoKSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbXVsdGlwbGUgbGV0dGVycyBmb3Igc2FtZSB3b3JkCiAgICAgICAgICAgIHdvcmRzX3NlZW4uaW5zZXJ0KHdvcmQpOwogICAgCiAgICAgICAgICAgIGV4cGVjdGVkX3dvcmQgPSB3b3JkOyAvLyBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gbGV0dGVyLCByZW1lbWJlciBhc3NvY2lhdGVkIHdvcmQKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXhwZWN0ZWRfd29yZCAhPSB3b3JkKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGRpZmZlcmVudCB3b3JkIGZvciBzYW1lIGxldHRlcgogICAgfQpyZXR1cm4gIShpc3MgPj4gd29yZCk7IC8vIGNoZWNrIG5vIHN1cnBsdXMgd29yZHMKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pewogICAgYm9vbCBiID0gZmluZE1hdGNoKCJyZWQgYmx1ZSBibHVlIHJlZCByZWQgeWVsbG93IHllbGxvdyIsICJhYmJhYWNkIik7CiAgICBzdGQ6OmNvdXQgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gMDsKfQ==