题意:
解法:
显然贪心地让前面的字符尽可能小,
开26个vector记录每种字符的位置,
在选择s[pos]最为第t个字符的时候,判断一下n-pos>=k-t是否成立即可,
如果成立则能选,否则不能选.
ps:
后来感觉写序列自动机更好,但是懒得改代码了.
code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=2e6+5;
vector<int>g[26];
int cur[26];
string s;
int n,k;
signed main(){
cin>>s>>k;
n=s.size();
for(int i=0;i<n;i++){
g[s[i]-'a'].push_back(i);
}
string ans;
int now=-1;
for(int kk=0;kk<k;kk++){
for(int i=0;i<26;i++){
int j=cur[i];
if(j>=(int)g[i].size())continue;
if(n-g[i][j]>=k-kk){
ans+=(char)('a'+i);
now=g[i][j];
break;
}
}
for(int i=0;i<26;i++){
int &j=cur[i];
while(j<(int)g[i].size()&&g[i][j]<=now){
j++;
}
}
}
cout<<ans<<endl;
return 0;
}