#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>
#include <vector>
#include <locale>
#include <cassert>
template <typename TContainer,typename TString>
void tokenize(TString input,TContainer& res)
{
if (input.length()<2) {
res.push_back(input);
return;
}
typename TString::const_iterator pos=input.begin();
bool space_state=std::isspace(input[0],std::locale());
for (typename TString::const_iterator it=input.begin(); it!=input.end();
++it) {
bool is_space=std::isspace(*it,std::locale());
if (is_space!=space_state) {
res.push_back(TString(pos,it));
pos=it;
space_state=is_space;
}
}
//the rest
if (pos!=input.end()) {
res.push_back(TString(pos,(typename TString::const_iterator)input.end()));
}
}
int main()
{
std::string test("hi how are you"),reference("ih woh era uoy");
std::vector<std::string> tokens;
tokenize(test,tokens);
for (auto& token : tokens)
std::reverse(token.begin(),token.end());
std::stringstream buf;
for (auto token : tokens)
buf<<token;
std::string res=buf.str();
assert(res==reference);
std::cout<<res<<std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxvY2FsZT4KI2luY2x1ZGUgPGNhc3NlcnQ+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVENvbnRhaW5lcix0eXBlbmFtZSBUU3RyaW5nPgp2b2lkIHRva2VuaXplKFRTdHJpbmcgaW5wdXQsVENvbnRhaW5lciYgcmVzKQp7CgogICAgaWYgKGlucHV0Lmxlbmd0aCgpPDIpIHsKICAgICAgICByZXMucHVzaF9iYWNrKGlucHV0KTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdHlwZW5hbWUgVFN0cmluZzo6Y29uc3RfaXRlcmF0b3IgcG9zPWlucHV0LmJlZ2luKCk7CiAgICBib29sIHNwYWNlX3N0YXRlPXN0ZDo6aXNzcGFjZShpbnB1dFswXSxzdGQ6OmxvY2FsZSgpKTsKICAgIGZvciAodHlwZW5hbWUgVFN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQ9aW5wdXQuYmVnaW4oKTsgaXQhPWlucHV0LmVuZCgpOwogICAgICAgICAgICArK2l0KSB7CiAgICAgICAgYm9vbCBpc19zcGFjZT1zdGQ6Omlzc3BhY2UoKml0LHN0ZDo6bG9jYWxlKCkpOwogICAgICAgIGlmIChpc19zcGFjZSE9c3BhY2Vfc3RhdGUpIHsKICAgICAgICAgICAgcmVzLnB1c2hfYmFjayhUU3RyaW5nKHBvcyxpdCkpOwogICAgICAgICAgICBwb3M9aXQ7CiAgICAgICAgICAgIHNwYWNlX3N0YXRlPWlzX3NwYWNlOwogICAgICAgIH0KICAgIH0KCiAgICAvL3RoZSByZXN0CiAgICBpZiAocG9zIT1pbnB1dC5lbmQoKSkgewogICAgICAgIHJlcy5wdXNoX2JhY2soVFN0cmluZyhwb3MsKHR5cGVuYW1lIFRTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yKWlucHV0LmVuZCgpKSk7CiAgICB9Cgp9CgoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnN0cmluZyB0ZXN0KCJoaSAgIGhvdyBhcmUgeW91IikscmVmZXJlbmNlKCJpaCAgIHdvaCBlcmEgdW95Iik7CgogICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKICAgIHRva2VuaXplKHRlc3QsdG9rZW5zKTsKCiAgICBmb3IgKGF1dG8mIHRva2VuIDogdG9rZW5zKQogICAgICAgIHN0ZDo6cmV2ZXJzZSh0b2tlbi5iZWdpbigpLHRva2VuLmVuZCgpKTsKCiAgICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7CiAgICBmb3IgKGF1dG8gdG9rZW4gOiB0b2tlbnMpCiAgICAgICAgYnVmPDx0b2tlbjsKCiAgICBzdGQ6OnN0cmluZyByZXM9YnVmLnN0cigpOwogICAgYXNzZXJ0KHJlcz09cmVmZXJlbmNlKTsKCiAgICBzdGQ6OmNvdXQ8PHJlczw8c3RkOjplbmRsOwp9