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;
}

  

 

posted @ 2014-12-11 17:38  Claris  阅读(273)  评论(0编辑  收藏  举报