BZOJ3799 : 字符串重组
从大到小枚举答案与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; }