原题链接
思路:
- 分类讨论,贪心考虑
- 当
k
>
n
k>n
k>n时,比较简单的一种情况,只需要将
s
s
s复制过来后在末尾补字典序最小的字母
- 当
k
<
=
n
k<=n
k<=n时,倒着考虑。如果这一位能够被替换为大的,就替换为比当前位大的,前面的都保持原序列;反之,就在这位放最小的,继续向前找;
代码:
const int maxn=2e5+100;
map<char,int>mp;
int get_nex(int x){
for(int i=x+1;i<26;i++){
char t=char(i+'a');
if(mp[t]) return i;
}
return -1;
}
int main(){
int _=read;
while(_--){
int n=read,k=read;
string s;cin>>s;
mp.clear();
char minn='z';
for(int i=0;s[i];i++) mp[s[i]]++,minn=min(minn,s[i]);
if(k>n){
cout<<s;
for(int i=0;i<k-n;i++) cout<<minn;
puts("");
}
else{
string t;
for(int i=k-1;k>=0;i--){
int tmp=get_nex(s[i]-'a');
if(tmp!=-1){
t=char(tmp+'a')+t;
t=s.substr(0,i)+t;
break;
}
t=minn+t;
}
cout<<t<<endl;
}
}
return 0;
}