CF1506G Maximize the Remaining String 题解
思路
题目中要求答案字符串的字典序最大,也就是说要让大的字符尽量靠前。
考虑维护一个类似于单调栈的东西,开一个数组记录每个字符在字符串中最后出现的位置。遍历字符串时,记当前字符为 \(C\),栈顶字符为 \(S_{top}\),在 \(C\) 不在栈里时,如果 \(C\) 大于 \(S_{top}\) 且 \(S_{top}\) 不是最后一次出现,就将它弹出,直到 \(S_{top}\) 大于 \(C\) 为止,然后将 \(C\) 压进栈里。
冷知识:字符串支持 pop_back
,所以直接用字符串来模拟栈即可,最后答案就是这个字符串。
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[1005],b[1005];
int lst[1005];
bool is[1005];
string s,ans;
int main(){
cin>>n;
while(n--){
memset(is,0,sizeof(is));
ans="";
cin>>s;
for(int i=0;i<s.size();i++)lst[s[i]]=i;
for(int i=0;i<s.size();i++){
if(is[s[i]]) continue;
while(ans.size()>0&&ans[ans.size()-1]<s[i]&&lst[ans[ans.size()-1]]>i) {
is[ans[ans.size()-1]]=0;
ans.erase(ans.size()-1,1);
}
ans+=s[i];
is[s[i]]=1;
}
cout<<ans<<endl;
}
}