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;

}

  

 

你可能感兴趣的:(字符串)