#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class Solution {
public:
void reverseWords(char *str) {
//char *str = (char*)s.c_str();
int n = removeSpaces(str);
reverseEachWord(str);
reverseString(str, str + n - 1);
//s.resize(n);
}
private:
char *searchNextNonSpace(char *s)
{
while(*s == ' ') ++s;
return s;
}
char *searchNextSpace(char *s)
{
while(*s && *s != ' ') ++s;
return s;
}
int removeSpaces(char *str)
{
char *curStr = str, *nextPlaceStr = str, *nextSpace = NULL;
int len = 0;
curStr = searchNextNonSpace(curStr);
while(*curStr){
nextSpace = searchNextSpace(curStr);
len = nextSpace - curStr;
if(nextPlaceStr != str) *(nextPlaceStr++) = ' ';
memmove(nextPlaceStr, curStr, len);
nextPlaceStr += len;
curStr += len;
curStr = searchNextNonSpace(curStr);
}
*nextPlaceStr = '\0';
return nextPlaceStr - str;
}
void reverseEachWord(char *str)
{
char* nextSpace = NULL;
while(*str){
nextSpace = searchNextSpace(str);
reverseString(str, nextSpace - 1);
str = searchNextNonSpace(nextSpace);
}
}
void reverseString(char *start, char *end)
{
while(start < end)
swap(*(start++), *(end--));
}
};
int main()
{
char str[100];
cin >> str;
Solution so;
so.reverseWords(str);
cout << str << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3N0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFNvbHV0aW9uIHsKcHVibGljOgogICAgdm9pZCByZXZlcnNlV29yZHMoY2hhciAqc3RyKSB7CiAgICAgICAgLy9jaGFyICpzdHIgPSAoY2hhciopcy5jX3N0cigpOwogICAgICAgIAogICAgICAgIGludCBuID0gcmVtb3ZlU3BhY2VzKHN0cik7CiAgICAgICAgcmV2ZXJzZUVhY2hXb3JkKHN0cik7CiAgICAgICAgcmV2ZXJzZVN0cmluZyhzdHIsIHN0ciArIG4gLSAxKTsKICAgICAgICAKICAgICAgICAvL3MucmVzaXplKG4pOwogICAgfQogICAgCnByaXZhdGU6CiAgICBjaGFyICpzZWFyY2hOZXh0Tm9uU3BhY2UoY2hhciAqcykKICAgIHsKICAgICAgICB3aGlsZSgqcyA9PSAnICcpICsrczsKICAgICAgICByZXR1cm4gczsKICAgIH0KICAgIAogICAgY2hhciAqc2VhcmNoTmV4dFNwYWNlKGNoYXIgKnMpCiAgICB7CiAgICAgICAgd2hpbGUoKnMgJiYgKnMgIT0gJyAnKSArK3M7CiAgICAgICAgcmV0dXJuIHM7CiAgICB9CiAgICAKICAgIGludCByZW1vdmVTcGFjZXMoY2hhciAqc3RyKQogICAgewogICAgICAgIGNoYXIgKmN1clN0ciA9IHN0ciwgKm5leHRQbGFjZVN0ciA9IHN0ciwgKm5leHRTcGFjZSA9IE5VTEw7CiAgICAgICAgaW50IGxlbiA9IDA7CiAgICAgICAgCiAgICAgICAgY3VyU3RyID0gc2VhcmNoTmV4dE5vblNwYWNlKGN1clN0cik7CiAgICAgICAgd2hpbGUoKmN1clN0cil7CiAgICAgICAgICAgIG5leHRTcGFjZSA9IHNlYXJjaE5leHRTcGFjZShjdXJTdHIpOwogICAgICAgICAgICBsZW4gPSBuZXh0U3BhY2UgLSBjdXJTdHI7CiAgICAgICAgICAgIGlmKG5leHRQbGFjZVN0ciAhPSBzdHIpICoobmV4dFBsYWNlU3RyKyspID0gJyAnOwogICAgICAgICAgICBtZW1tb3ZlKG5leHRQbGFjZVN0ciwgY3VyU3RyLCBsZW4pOwogICAgICAgICAgICBuZXh0UGxhY2VTdHIgKz0gbGVuOwogICAgICAgICAgICBjdXJTdHIgKz0gbGVuOwogICAgICAgICAgICBjdXJTdHIgPSBzZWFyY2hOZXh0Tm9uU3BhY2UoY3VyU3RyKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgKm5leHRQbGFjZVN0ciA9ICdcMCc7CiAgICAgICAgcmV0dXJuIG5leHRQbGFjZVN0ciAtIHN0cjsKICAgIH0KICAgIAogICAgdm9pZCByZXZlcnNlRWFjaFdvcmQoY2hhciAqc3RyKQogICAgewogICAgICAgIGNoYXIqIG5leHRTcGFjZSA9IE5VTEw7CiAgICAgICAgd2hpbGUoKnN0cil7CiAgICAgICAgICAgIG5leHRTcGFjZSA9IHNlYXJjaE5leHRTcGFjZShzdHIpOwogICAgICAgICAgICByZXZlcnNlU3RyaW5nKHN0ciwgbmV4dFNwYWNlIC0gMSk7CiAgICAgICAgICAgIHN0ciA9IHNlYXJjaE5leHROb25TcGFjZShuZXh0U3BhY2UpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgdm9pZCByZXZlcnNlU3RyaW5nKGNoYXIgKnN0YXJ0LCBjaGFyICplbmQpCiAgICB7CiAgICAgICAgd2hpbGUoc3RhcnQgPCBlbmQpCiAgICAgICAgICAgIHN3YXAoKihzdGFydCsrKSwgKihlbmQtLSkpOwogICAgfQp9OwoKaW50IG1haW4oKQp7CgljaGFyIHN0clsxMDBdOwoJY2luID4+IHN0cjsKCQoJU29sdXRpb24gc287Cglzby5yZXZlcnNlV29yZHMoc3RyKTsKCQoJY291dCA8PCBzdHIgPDwgZW5kbDsKCXJldHVybiAwOwp9