从大到小枚举答案与T串的lcp,然后贪心
#include<cstdio>
#include<cstring>
char s[5010],t[5010],ans[5010];
int n,m,i,j,a[128],b[128],flag;
int main(){
scanf("%s%s",s,t);
n=std::strlen(s),m=std::strlen(t);
for(i=0;i<n;i++)a[s[i]]++;
for(i=m;~i;i--){
for(j=0;j<128;j++)b[j]=a[j];
for(j=flag=0;j<i;j++){ans[j]=t[j];if((--b[t[j]])<0)flag=1;}
if(flag)continue;
for(flag=1,j=t[i]+1;j<128;j++)if(b[j]){flag=0;break;}
if(flag)continue;
b[ans[i]=j]--;
for(j=0;j<=i;j++)putchar(ans[j]);
for(j=0;j<128;j++)while(b[j]--)putchar(j);
return 0;
}
return puts("-1"),0;
}