总体思路是采用O(nlgn)的最长递增子序列算法,然后进行输出即可
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
int main(){
string str;
cin>>str;
vector<string> arr;
string s="";
for (int i = 0; i < str.length(); i++){
if(str[i]>='A' && str[i]<='Z'){
if(s!=""){
arr.push_back(s);
s="";
}
}
s+=str[i];
}
arr.push_back(s);
/*
for(auto& s:v){
cout<<s<<endl;
}
*/
vector<string> dp(arr.size()+1);
vector<int> pos(arr.size()+1,0);
vector<int> ans(arr.size()+1,0);
dp[1]=arr[0];
int len = 1;
for (int i = 1; i < arr.size(); ++i) {
if (arr[i] > dp[len]) {
dp[++len] = arr[i];
pos[i] = len;
}
else {
int p = lower_bound(dp.begin()+1, dp.begin()+1+len, arr[i]) - dp.begin();
dp[p] = arr[i];
pos[i] = p;
}
}
int t = len;
for (int i = arr.size() - 1; i >= 0; --i) {
if (!len)
break;
if (pos[i] == len) {
ans[len] = i;
--len;
}
}
for (int i = 1; i <= t; ++i) {
cout << arr[ans[i]];
}
system("pause");
return 0;
}