#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
string findLDS(const string& sequence) {
int n = sequence.size();
// dp[i] 表示以 sequence[i] 结尾的最大递减子序列的长度
vector<int> dp(n, 1);
// 记录最大递减子序列的末尾位置
vector<int> endPos(n, -1);
for (int i = 1; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (sequence[j] > sequence[i] && dp[j] + 1 > dp[i]) {
//sequence[j] > sequence[i] 兩個輸入數列前後數字比較
//dp[j] + 1 > dp[i] 是要找j 位置結尾的遞減數列加上當前位置的元素後
//是否得到比當前以 i 位置結尾的數列長度更長
dp[i] = dp[j] + 1;
endPos[i] = j;
//dp[i] 表示以 sequence[i] 結尾的最大遞減子序列的長度
//endPos[i] 則用於記錄這個數列的前一個元素的位置
}
}
}
// 找到最大递减子序列的末尾位置
int maxLen = 0, maxEndPos = 0;
for (int i = 0; i < n; ++i) {
if (dp[i] > maxLen) {
maxLen = dp[i];
maxEndPos = i;
}
}
// 构造最大递减子序列
string result;
while (maxEndPos != -1) {
result += sequence[maxEndPos];
maxEndPos = endPos[maxEndPos];
}
reverse(result.begin(), result.end());
return result;
}
int main() {
string sequence;
bool outend = false;
while (cin >> sequence) {
string LDS = findLDS(sequence);
if(!outend){
cout << LDS;
outend = true;
}else{
cout << endl << LDS;
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RyaW5nIGZpbmRMRFMoY29uc3Qgc3RyaW5nJiBzZXF1ZW5jZSkgewogICAgaW50IG4gPSBzZXF1ZW5jZS5zaXplKCk7CgogICAgLy8gZHBbaV0g6KGo56S65LulIHNlcXVlbmNlW2ldIOe7k+WwvueahOacgOWkp+mAkuWHj+WtkOW6j+WIl+eahOmVv+W6pgogICAgdmVjdG9yPGludD4gZHAobiwgMSk7CgogICAgLy8g6K6w5b2V5pyA5aSn6YCS5YeP5a2Q5bqP5YiX55qE5pyr5bC+5L2N572uCiAgICB2ZWN0b3I8aW50PiBlbmRQb3MobiwgLTEpOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyArK2opIHsKICAgICAgICAgICAgaWYgKHNlcXVlbmNlW2pdID4gc2VxdWVuY2VbaV0gJiYgZHBbal0gKyAxID4gZHBbaV0pIHsKICAgICAgICAgICAgCS8vc2VxdWVuY2Vbal0gPiBzZXF1ZW5jZVtpXSDlhanlgIvovLjlhaXmlbjliJfliY3lvozmlbjlrZfmr5TovIMKICAgICAgICAgICAgCS8vZHBbal0gKyAxID4gZHBbaV0g5piv6KaB5om+aiDkvY3nva7ntZDlsL7nmoTpgZ7muJvmlbjliJfliqDkuIrnlbbliY3kvY3nva7nmoTlhYPntKDlvowKICAgICAgICAgICAgCS8v5piv5ZCm5b6X5Yiw5q+U55W25YmN5LulIGkg5L2N572u57WQ5bC+55qE5pW45YiX6ZW35bqm5pu06ZW3CiAgICAgICAgICAgICAgICBkcFtpXSA9IGRwW2pdICsgMTsKICAgICAgICAgICAgICAgIGVuZFBvc1tpXSA9IGo7CiAgICAgICAgICAgICAgICAvL2RwW2ldIOihqOekuuS7pSBzZXF1ZW5jZVtpXSDntZDlsL7nmoTmnIDlpKfpgZ7muJvlrZDluo/liJfnmoTplbfluqYKICAgICAgICAgICAgICAgIC8vZW5kUG9zW2ldIOWJh+eUqOaWvOiomOmMhOmAmeWAi+aVuOWIl+eahOWJjeS4gOWAi+WFg+e0oOeahOS9jee9rgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIOaJvuWIsOacgOWkp+mAkuWHj+WtkOW6j+WIl+eahOacq+WwvuS9jee9rgogICAgaW50IG1heExlbiA9IDAsIG1heEVuZFBvcyA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChkcFtpXSA+IG1heExlbikgewogICAgICAgICAgICBtYXhMZW4gPSBkcFtpXTsKICAgICAgICAgICAgbWF4RW5kUG9zID0gaTsKICAgICAgICB9CiAgICB9CgogICAgLy8g5p6E6YCg5pyA5aSn6YCS5YeP5a2Q5bqP5YiXCiAgICBzdHJpbmcgcmVzdWx0OwogICAgd2hpbGUgKG1heEVuZFBvcyAhPSAtMSkgewogICAgICAgIHJlc3VsdCArPSBzZXF1ZW5jZVttYXhFbmRQb3NdOwogICAgICAgIG1heEVuZFBvcyA9IGVuZFBvc1ttYXhFbmRQb3NdOwogICAgfQoKICAgIHJldmVyc2UocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKICAgIHN0cmluZyBzZXF1ZW5jZTsKICAgIGJvb2wgb3V0ZW5kID0gZmFsc2U7CiAgICB3aGlsZSAoY2luID4+IHNlcXVlbmNlKSB7CiAgICAgICAgc3RyaW5nIExEUyA9IGZpbmRMRFMoc2VxdWVuY2UpOwogICAgICAgIGlmKCFvdXRlbmQpewogICAgICAgICAgICBjb3V0IDw8IExEUzsKICAgICAgICAgICAgb3V0ZW5kID0gdHJ1ZTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgY291dCA8PCBlbmRsIDw8IExEUzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQo=