总体思路是采用O(nlgn)的最长递增子序列算法,然后进行输出即可
#include#include #include #include #include using namespace std; int main(){ string str; cin>>str; vector 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); vector dp(arr.size()+1); vector pos(arr.size()+1,0); vector 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; }



