思路:
分类讨论,贪心考虑
当k > n时,比较简单的一种情况,只需要将s复制过来后在末尾补字典序最小的字母
当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]); //for(auto t:mp) cout<<t.first<<" "<<t.second<<endl; 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--){ //cout<<s[i]-'a'<<endl; int tmp=get_nex(s[i]-'a'); //cout<<tmp<<endl; if(tmp!=-1){ t=char(tmp+'a')+t; t=s.substr(0,i)+t; break; } t=minn+t; } cout<<t<<endl; } } return 0; }